nodejs express, ajax 发布 w/jquery 并接收响应
Posted
技术标签:
【中文标题】nodejs express, ajax 发布 w/jquery 并接收响应【英文标题】:nodejs express, ajax posting w/ jquery and receiving response 【发布时间】:2011-09-11 11:15:15 【问题描述】:在快速响应我的 jquery ajax 请求时遇到一些麻烦。实际发布工作正常,但无论我尝试什么,我似乎都无法从我的应用程序中获得可以使用的数据响应。起初它只是不断地发布和挂起,大约一分钟后它会回复一个警报,上面写着“XML 文档已加载”(不知道它来自哪里)——不管怎样,现在它给了我
SyntaxError: Unexpected token 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');
,
);
【问题讨论】:
node 标签不适用于 node.js 能否打开chrome调试器检查器查看请求正文的JSON内容?您看到的错误是服务器端 JSON 解析阻塞请求正文中的 JSON 内容。这由 express.bodyParser() 处理。也许发布您的请求内容供人们检查。您可能还想暂时停止使用 express.bodyParser(),以便更容易手动调试您的问题,查看原始请求正文。 我正在尝试使用此修复的类似技术,但我无法让 'req.body.objectData 返回任何内容,但只能返回错误。您是否正在使用其他模块或知道为什么这不起作用? 【参考方案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 Object Notation 是一种在应用程序之间以对象格式共享数据的方法。但是,如果不先将对象转换为字符串并将其作为单个变量发送,则无法通过 HTTP 请求发送对象。函数JSON.parse()
和JSON.stringify()
为我们完成了这项工作。
【讨论】:
这很有用。对我来说,单击提交后,我在页面上得到了 JSON,但没有 html。但是当我使用stringify
时,我在 AJAX 中将 HTML 和数据传给了我的成功函数。谢谢你的解释。我不认为这会有所帮助,但我尝试了一下,似乎得到了预期的结果。【参考方案2】:
由于您使用的是快递,
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(是的,看起来像一个循环,但一切正常)。
【讨论】:
【参考方案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 标头与解析工作相关。
在节点服务器端,我可以这样处理payload:
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]);
// ...
// ...
【讨论】:
您如何使用 saveTeams? req.post('/blabla', saveTeams) ?以上是关于nodejs express, ajax 发布 w/jquery 并接收响应的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 jQuery .ajax() 路由的 .done() 方法没有在我的 NodeJS、Express 和 Mongoose 项目中触发?
用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库