Экспресс nodejs, отправка ajax с jquery и получение ответа - PullRequest
21 голосов
/ 09 июня 2011

Возникли проблемы при получении express для правильного ответа на мой запрос jquery ajax.Реальная публикация работает нормально, но независимо от того, что я пытаюсь сделать, я не могу получить ответ от своего приложения, который я могу использовать.Сначала он просто постоянно публиковал сообщения и зависал, и через минуту он отвечал предупреждением, в котором говорилось что-то вроде «Загружен XML-документ» (понятия не имею, откуда он). В любом случае, теперь он дает мне

SyntaxError: Неожиданный токен ILLEGAL при разборе (нативном) в IncomingMessage.

В моем экспресс-приложении у меня есть:

    app.post('/save', function(req, res) {
      console.log(req.body.objectData);
      res.contentType('json');
      res.send({ some: 'json' });
    });

и в моем jquery:

  $.ajax({
    url: "/save",
    type: "POST",
    dataType: "json",
    data: {objectData: someObject},
    contentType: "application/json",
    cache: false,
    timeout: 5000,
    complete: function() {
      //called when complete
      console.log('process complete');
    },

    success: function(data) {
      console.log(data);
      console.log('process sucess');
   },

    error: function() {
      console.log('process error');
    },
  });

Ответы [ 3 ]

21 голосов
/ 19 ноября 2011

Вы отправляете не правильный ответ JSON, а строку, содержащую слово json, поэтому на стороне клиента происходит сбой JSON.parse(). Попробуйте это:

app.post('/save', function(req, res) {
  console.log(req.body.objectData);
  res.contentType('json');
  res.send({ some: JSON.stringify({response:'json'}) });
});

JavaScript Object Notation - это способ обмена данными между приложениями в формате объекта. Однако вы не можете отправить объект по HTTP-запросу, не превратив его сначала в строку и не отправив как одну переменную. Функции JSON.parse() и JSON.stringify() делают это для нас.

2 голосов
/ 17 июня 2015

Комментарий пастора Бонс был для меня особенно важен, так как я использовал $ .ajax для публикации на Node-сервере.Моя соответствующая часть кода в конечном итоге выглядит так:

// Incoming parameter "teams" is an array of objects
function saveTeams(teams) {
    var xhr;
    var data = JSON.stringify({ teams: teams });

    xhr = $.ajax({
        type: "POST",
        url: "http://localhost:8000/saveteam",
        contentType: "application/json",
        data: data,
        headers: {
            Authorization: "..."
        }
    });

    return xhr;
} 

Обратите внимание, что заголовок contentType важен для синтаксического анализа.

На стороне сервера узла я могу обрабатывать полезную нагрузку следующим образомэто:

saveTeams: function (req, res, next) {
    var teams = req.body.teams;

    if (teams.length > 0) {
        console.log("Teams to be added:");
        for (var i = 0; i < teams.length; i++) {
            console.log(teams[i]);
            // ...
        }
    }
    // ...
}
1 голос
/ 12 марта 2014

Поскольку вы используете экспресс,

res.contentType('json');

должно быть:

res.type('json');

, но установка типа не требуется, поскольку это делается автоматически для вас.

См. express api docs для res.type .

Также обратите внимание, что для express res.send({blah:"gee"}); автоматически конвертирует объекты json, используя JSON.stringify для внутреннего использования.После нажатия на ссылку выше, нажмите res.send и, пока вы это делаете, res.json, что экономит немного ресурсов процессора, когда вы знаете, что отправляете JSON.Обратите внимание, что если вы отправляете JSON, тип автоматически устанавливается на JSON.

Всегда лучше смотреть на источник !Обратите внимание, что res.send вызывает this.json, когда обнаруживает JSON, и что res.json вызывает this.send (да, это похоже на цикл, но все работает).

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