Node.js res.send不工作

在我的index.js中,我有一个导出函数,应该通过按下提交button通过ajax将数据发送回客户端。 但是,当用户按下提交时,数据似乎在数据被修改之前被发送。 当再次按下提交时,它会发送之前修改过的数据,就像点击提交button只发送“以前”设置的数据一样。 这是我的代码:

var tabledata = getRecordFromDatabase(key); if(tabledata.length === 0) tabledata = 'There is no matched record in the database'; res.contentType('text/html'); res.send({'matched':tabledata}); 

所以为了说明这个错误:我填写表单后点击提交,然后收到“数据库中没有匹配logging”的消息。 我打了第二次提交,没有改变我刚刚填写的表单中的任何内容。 这次logging的数据实际上是发给我的。 为什么会这样?

如果你在getRecordFromDatabase做的任何事情都是asynchronous和非阻塞的,那么node.js就像它应该那样工作。 Node.js是非阻塞的 – 它不会停止并等待进程完成(除非这些进程是有意写入block的,这通常是在node.js中避免的)。 这是有益的,因为它使服务器可以自由地接受新的请求并且一次处理许多请求。

如果你的数据库调用是asynchronous的,那么在你res.send()之前你不会等待它的返回。 这就是为什么你的第一次提交返回空。 最有可能的是,当你第二次提交时,你的数据库调用终于回来了,这就是为什么你会得到一个结果。

你很难给出一个基于代码的答案来解决你的问题,因为你已经提取了数据库调用方法中发生的事情。 但通常情况下,asynchronous调用会像这样:

 getRecordFromDatabase(key, function(err, data){ if(data.length === 0) data = 'There is no matched record in the database'; res.contentType('text/html'); res.send({'matched':data}); }); 

这样,你传递一个函数作为你的asynchronous方法的callback执行 – 当asynchronous调用完成时,它执行callback,然后用适当的数据执行res.send()