angularjs искажает JSON при отправке данных на сервер с помощью POST - PullRequest
0 голосов
/ 24 августа 2018

У меня есть экспресс-сервер Nodejs и клиент angularJs, который отправляет данные на сервер.

Проблема в том, что когда я пытаюсь отправить JSON на сервер с angularJS, полученный JSON становится таким:

{"{\"question\":\"What will be result of code int a ":" 5/2\",\"answers\":[{\"a\":\"2.50\",\"b\":\"1\",\"c\":\"2\",\"d\":\"no right answer\"}],\"answer\":\"c\",\"score\":\"100\"}"}

Вот мой метод сообщения в angularJS:

createQuestion: function(question){
  delete question["_id"];
      console.log(JSON.stringify(question))
        return $http.post('http://localhost:3000/questions/', question, {
        headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
    })
        .then(
                function(response){
                    return response.data;
                },
                function(errResponse){
                    console.error('Error while creating question');
                    return $q.reject(errResponse);
                }
        );
    }

вывод console.log(JSON.stringify(question)):

{"question":"What will be result of code int a = 5/2","answers":[{"a":"2.50","b":"1","c":"2","d":"no right answer"}],"answer":"c","score":"100"}

Вот часть кода в nodejs, отвечающая за методы POST:

exports.create_a_question = function(req, res) {
  console.log(JSON.stringify(req.body))
  var new_question = new Question(req.body);
  new_question.save(function(err, question) {
    if (err)
      res.send(err);
    res.json(question);
  });
};

После поиска я обнаружил, что эта проблема возникает из-за application/x-www-form-urlencoded в заголовке запросов, но я добавляю эту конфигурацию на мой сервер nodejs, и проблема все еще сохраняется:

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

Вот заголовки CORS на сервере nodejs:

res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
res.setHeader('Access-Control-Max-Ag', '3600');

Как мне решить проблему?

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Обратная косая черта ("\") происходит, когда JSON.stringify вызывается дважды:

var x = {a:1, b:2};
var y1 = JSON.stringify(x);
var y2 = JSON.stringify(y1);
console.log(y2);

Платформа AngularJS автоматически выполняет JSON.stringify с помощью метода $http.post.Второй код JSON.stringify был вызван в коде Node.js.

Решение заключается в использовании JSON.parse в коде Node.js:

.

var x = {a:1, b:2};
var y1 = JSON.stringify(x);
var y2 = JSON.parse(y1);
console.log(y2);
0 голосов
/ 27 августа 2018

Итак, вот как я решил проблему: скачайте библиотеку cors через npm:

npm install --save cors

используйте его в коде:

var cors = require('cors');
app.use(cors());

затем я удалил ненужную опцию заголовка при вызове angularjs $http.post

0 голосов
/ 24 августа 2018

Возможно:

    headers: { 'Content-Type': 'multipart/form-data', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache'}

Поскольку здесь обсуждается несколько типов контента ...

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