Node.js res.send无效

时间:2012-07-24 15:40:55

标签: node.js express

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

        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});

为了说明错误:我在填写表格后点击提交并收到消息“数据库中没有匹配的记录”。我第二次点击提交而没有改变我刚刚填写的表格中的任何内容。这段时间记录数据实际上是发给我的。为什么会这样?

1 个答案:

答案 0 :(得分:4)

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

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

很难为您的问题提供基于代码的答案,因为您抽象出了DB调用方法中发生的事情。但通常情况下,异步调用会像:

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});
});

这样,您将传递一个函数作为异步方法的回调执行 - 当异步调用完成时,它会执行回调,然后回调执行带有适当数据的res.send()