nodejs express,ajax发布w / jQuery和接收响应
遇到一些麻烦,得到快速响应我的jQuery Ajax请求。 实际发布工作正常,但无论我尝试我似乎无法真正从我的应用程序,我可以使用的数据响应。 起初,它只是不停地发布和挂起,就像一分钟后,它会回应一个警告,说像“XML文件加载”(不知道它来自哪里) – 反正,现在它给我
SyntaxError:在IncomingMessage上parsing(本机)的意外标记ILLEGAL。
在我的快速应用程序中,我有:
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'); }, });
您不是发送有效的JSON响应,而是包含单词json
的string,因此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请求发送对象,而无需先将其转换为string并将其作为单个variables发送。 函数JSON.parse()
和JSON.stringify()
为我们做了这个。
既然你使用快递,
res.contentType('json');
应该:
res.type('json');
但设置types不是必需的,因为它是为你自动完成的。
请参阅res.type上的express api文档 。
另外请注意,对于express, res.send({blah:"gee"});
在内部使用JSON.stringify自动转换json对象。 点击上面的链接后,点击res.send
,当你知道你正在发送JSON的时候, res.json
会节省一点处理器的开销。 请注意,如果您发送JSON,则types会自动设置为JSON。
总是最好的看看来源 ! 请注意,res.send在检测到JSON时会调用this.json,而res.json会调用this.send(好像是一个循环,但它都可以运行)。
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标题与parsing工作相关。
在节点服务器端,我可以像这样处理负载:
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]); // ... } } // ... }