Как перенести клиентские массивы Javascript и POST через API Node.js в базу данных MongoDB? - PullRequest
0 голосов
/ 01 июня 2018

У меня есть одна веб-страница, которая изначально имеет два ввода формы, один для списка имен, а другой для названия игры.Я написал несколько javascript / jquery, которые берут X имен и создают X дополнительных входных данных формы, предназначенных для каждого конкретного человека.Затем Javascript создает следующие переменные после нажатия кнопки отправки формы имен / оценок:

gameTitle = Monopoly
users = [Bob, Bill, Jim, Janet]
scores = [100, 110, 90, 80]
positions = [2, 1, 3, 4]

Затем у меня настроена схема MongoDB:

const SessionSchema = new mongoose.Schema({
gameTitle: String,
users: [],
scores: [],
positions: []
});

ИОбработчик Node.js как таковой:

const express = require('express');
const router = express.Router();
const bodyParser = require('body-parser');
const timestamps = require('mongoose-timestamp');

router.use(bodyParser.urlencoded({ extended: true }));
router.use(bodyParser.json());

const Session = require('./Session');

//Post a session to the database
router.post('/', function(req, res) {
    Session.create({
        gameTitle : req.body.gameTitle,
        users : req.body.user,
        scores : req.body.score,
        positions : req.body.position
    },
    function (err, session) {
        if (err) return res.status(500).send("There was a problem adding the information to the database");
        res.status(200).send(session);
    });
});

Используя Почтальон, я вижу, что отправка работает, когда я использую этот формат:

Почтальон POST

Почтальон GET

Как мне взять созданные переменные javascript, а также, после нажатия кнопки отправки формы имен / оценок, отправить их через API в базу данных MongoDB?

Прошу прощения, если я пропустил какую-либо важную информацию / код - я не полностью обдумал, как работает бэкэнд.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Похоже, у вас работает серверная часть.То, что вам не хватает, это запрос API.Поскольку ваш веб-сайт не находится под тем же host:port, что и ваш сервер API, при выполнении этого из браузера вы столкнетесь с проблемами CORS.Давайте вернемся к этому позже:

Сначала вы сделаете вызов API.Вы можете использовать axios или fetch .Давайте начнем с fetch здесь:

fetch(url, {
  body: JSON.stringify(yourJavascriptVariablesAsAnObject),
  headers: {
    'Content-Type': 'application/json'
  },
  method: 'POST',
})
  .then(response => {
    // here you can check for status if you want.
    // ...

    return response.json(); // assuming server returns JSON.
  })
  .then(responseBody => {
    // Do something with the server's response body
  });

Теперь для проблемы с CORS, если ваше клиентское приложение из create-реакции-app или, по крайней мере, вы используете webpack-dev-server , вы можете действительно легко запрашивать прокси.

Если нет, то вам нужно разрешить CORS на вашем сервере nodeJS.Самый простой способ - использовать библиотеку .

PS: CORS в основном означает, что вы не можете выполнять запросы от браузера к службе, находящейся в другом `url: port :, если это неСервис явно говорит, что все в порядке.

Третий вариант - поместить пользовательский интерфейс и серверный проект за веб-сервером, таким как Nginx, и прокси-запросами, но это звучит слишком сложно для того, что вам нужно.

0 голосов
/ 01 июня 2018

Вам необходимо зарегистрировать вашу схему:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const SessionSchema = new mongoose.Schema({
   gameTitle: String,
   users: [],
   scores: [],
   positions: []
});

module.exports = mongoose.model('session', SessionSchema);

И здесь вам нужно использовать модель схемы Монго, например:

const express = require('express');
const router = express.Router();
const bodyParser = require('body-parser');
const timestamps = require('mongoose-timestamp');

router.use(bodyParser.urlencoded({ extended: true }));
router.use(bodyParser.json());


const SessionSchema  = require('./Session'); // register the mongo model

const mongoose = require('mongoose');
const Session  = mongoose.model('session');

//Post a session to the database
router.post('/', function(req, res) {
    const new_session = {
        gameTitle : req.body.gameTitle,
        users : req.body.user,
        scores : req.body.score,
        positions : req.body.position
    };


    new_session.save((err, saved_session) => {
        if(err) {
            res.json(err);
        } else {
            res.json(saved_session);
        }
    });

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...