在使用express来正确响应我的jquery ajax请求时遇到一些麻烦。实际发布工作正常,但无论我尝试什么,我似乎无法从我的应用程序实际获得我可以使用的数据响应。起初它只是张贴和不断悬挂,就像一分钟之后,它会响应一个警告,说“加载XML文件”(不知道它来自哪里) - 无论如何,现在它给了我
SyntaxError:意外的令牌ILLEGAL 在解析(本机) 在IncomingMessage。
在我的快递App中,我有:
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');
},
});
答案 0 :(得分:21)
您没有发送有效的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()
为我们执行此操作。
答案 1 :(得分:2)
牧师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标头与解析工作相关。
在节点服务器端,我可以像这样处理有效负载:
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]);
// ...
}
}
// ...
}
答案 2 :(得分:1)
由于您使用快递,
res.contentType('json');
应该是:
res.type('json');
但不需要设置类型,因为它是自动完成的。
请参阅express api docs on res.type。
另请注意,对于express,res.send({blah:"gee"});
在内部使用JSON.stringify自动转换json对象。单击上面的链接后,单击res.send
,然后在您使用res.json
时,当您知道要发送JSON时,这会节省一点处理器开销。请注意,如果发送JSON,则类型将自动设置为JSON。
总是最好看the source!请注意,res.send在检测到JSON时调用this.json,并且res.json调用this.send(是的,它似乎是一个循环,但一切都解决了)。