Подтвердить что ты не робот

Nodejs express, ajax posting w/jquery и получение ответа

Имея некоторые проблемы с получением выражения, чтобы правильно реагировать на мой jQuery-запрос ajax. Фактическая публикация работает нормально, но независимо от того, что я пытаюсь, я не могу, по-видимому, получить ответ от моего приложения, который я могу использовать. Сначала это была просто публикация и вешание постоянно, и, как через минуту, она ответила предупреждением, в котором говорилось что-то вроде "Документ XML загружен" (понятия не имею, откуда он). В любом случае, теперь он дает мне

СинтаксисError: Неожиданный токен 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');
    },
  });
4b9b3361

Ответ 1

Вы не отправляете действительный ответ 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 - это способ обмена данными между приложениями в формате объекта. Однако вы не можете отправить объект по HTTP-запросу, не превратив его сначала в строку и отправив ее как одну переменную. Функции JSON.parse() и JSON.stringify() делают это для нас.

Ответ 2

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

res.contentType('json');

должен быть:

res.type('json');

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

См. выражение api docs на res.type.

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

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

Ответ 3

Комментарий Pastor Bones был особенно важен для меня, поскольку я использовал $.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 подходит для работы синтаксического анализа.

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

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]);
            // ...
        }
    }
    // ...
}