2016-08-19 110 views
0

在Express應用程序的結束之前響應我願做這樣的事情:Express.js發送執行

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

的問題是:我可以肯定的是send()返回後的反應 已經在它的方式返回給用戶?還是隻有在執行我的處理函數後才發送?

是的,您可以確定數據正在運行。在您撥打res.send()時,數據已寫入底層TCP基礎架構,然後由TCP堆棧發送。由於TCP Nagle算法,在發送數據之前可能會有一段很短的延遲,但它不會等待Express應用程序中的任何內容。數據將在TCP堆棧決定發送時立即發送。

在發送響應之後,您是否在請求處理程序中執行其他操作並不重要。

如果您想要關注此實際源代碼,請首先查看res.send(data) in express,最終最終會調用res.end(data) in the http module。而且,通過查看http模塊,可以看到它在調用時將數據同步寫入TCP實現。在Express中沒有任何魔法延遲等待其他事情發生。

1

是的。即使在通過res.send()發送數據後,代碼也會在函數中執行。

但是,在您使用res.send()後,您將不能再發送任何其他數據,並使用該請求的相同響應。