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');
},
});
Ответы
Ответ 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]);
// ...
}
}
// ...
}