在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()
返回后响应已经回到用户的路上吗?或者它是在执行我的处理函数后才发送的?
感谢
答案 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中等待其他事情没有神奇的延迟。