Express.js在执行结束前发送响应

时间:2016-08-19 17:55:06

标签: node.js express

在Express应用程序中,我想做这样的事情:

app.get('/some/route', someMiddleWare(), function(req, res){
    var status = undefined;
    if( /*someCondition*/ ) status = 200;
    else status = 403

    res.status(status).send('');

    // do something else
})

在第一部分中,为了解码要给出的响应,我需要做一些事情,在第二部分(send()之后)我做了一些额外的事情,需要在同一个执行中完成(即不是异步的) )但并不真正关心用户。 问题是:我可以确定在send()返回后响应已经回到用户的路上吗?或者它是在执行我的处理函数后才发送的? 感谢

2 个答案:

答案 0 :(得分:1)

是。即使您通过res.send()发送数据,您的代码也会在函数中执行。

但是,在您使用res.send()后,您将无法再向该请求发送具有相同响应的任何其他数据。

答案 1 :(得分:0)

  

问题是:我可以确定在send()返回响应后   已经回归用户?或者只是在发送之后才发送   执行我的处理函数?

是的,您可以确定数据正在进行中。在您调用res.send()时,数据已写入底层TCP基础结构,然后由TCP堆栈发送。由于TCP Nagle算法,在发送数据之前可能会有短暂的延迟,但它不会等待Express应用程序中的任何内容。一旦TCP堆栈决定发送数据,就会发送数据。

在发送响应后,您是否在请求处理程序中执行其他操作无关紧要。

如果您想关注实际的源代码,请先查看res.send(data) in express,最终会调用res.end(data) in the http module。并且,通过查看http模块,您可以看到它在调用时同步将数据写入TCP实现。在Express中等待其他事情没有神奇的延迟。