2017-10-10 26 views
2

的express.js文檔指出,如果next()永遠不會在路線稱爲然後如果我在express.js中忽略next()會怎麼樣?

請求將被留下掛

https://expressjs.com/en/guide/writing-middleware.html

是什麼暗示?這是否意味着即使我已經調用res.send並且請求處理完成,我也應該使用next()完成每個請求?如果我忽略它,不會有內存泄漏或其他問題嗎?

更新: 我的確讓中間件與路線混淆了。我忘記了這個循環可以結束。但我不知道如何結束它。

+0

它對**中間件**這麼說,但你在問路由。你確定你正在閱讀文檔的正確部分嗎?你知道中間件是什麼嗎? – Mjh

+0

發佈您的代碼以更好地解釋問題 –

回答

2

這是什麼意思?

這意味着請求/響應週期仍未完成。該響應不會被髮送到瀏覽器,瀏覽器將繼續等待。

這是否意味着即使我已經調用res.send並且請求處理已完成,我是否應該使用next()完成每個請求?

整個句子是...

如果當前的中間件功能並沒有結束請求響應週期, 它必須調用next()來控制傳遞給下一個中間件功能。 否則,請求將被掛起。

所以,如果你打算在目前的中間件內結束循環,你可以在沒有next()的情況下調用res.send,res.end或res.json。但是如果你打算去下一個中間件,你應該調用next(),否則它不會去下一個中間件。

如果我忽略它,不會出現內存泄漏或其他問題嗎?

如果請求/響應週期未完成,則分配用於該週期的內存將不會返回,這意味着內存泄漏。

1

我不認爲它會導致任何內存泄漏,我們也使用next()爲了調用下一個middleware像假設你有兩件事要做,首先認證用戶,然後發送數據的請求現在你應該做的是首先在一箇中間件中進行身份驗證,然後在用戶驗證該請求時成功,否則不會。

1

nextcallback函數本質上是用信號通知事件循環發射器的方式,表示當前函數已完成處理。您可以通過將參數作爲參數傳遞給下一個函數來傳遞數據。

如果您不調用callbacknext函數,那麼事件循環中接下來的函數將永遠不會執行。 Express處理請求後必須具有某些功能鏈。所以,絕對不是跳過調用回調函數本身的好習慣。當你想通過控制鏈中的下一個中間件(如通用中間件來處理錯誤)

因爲中間件的順序聲明相關

1

next()被調用時,表示只會照顧驗證函數的參數,如果它找到第三個參數,那麼它會傳遞一個指向後續中間件的指針。

如果您將結果返回給客戶端(例如,調用res.send()),您不需要調用next(),因爲請求已經結束。

//this is an example of a hanging request since you're not calling 
//niether next nor res.send() 
router.get('/myRoute', (req, res, next) => { 
    //do nothing 
}) 
1

沒有內存泄漏,而你不想打電話next()如果沒有更多的中間件(res.send()後)運行。 next()是一個cb函數的佔位符。這就是中間件,它是一個或多個順序調用的函數,直到到達請求 - 響應週期的末尾。在本例中,當我們點擊login端點時,我們將運行2箇中間件:validatechangeStuff,然後我們調用returnResponse函數並且結束請求 - 響應循環。

get('/login', 
validate, 
changeStuff, 
returnResponse 
); 

function validate(req, res, next) { 
//validate logic does something then calls next() 

next() 
//just like calling changeStuff(req, res, next) 
} 

function changeStuff(req, res, next) { 
//changeStuff logic changes something then calls next() 

next() 
//just like calling returnResponse(req, res, next) 
} 

function returnResponse(req, res) { 
//will return something and that is the end of the req-res cycle 
//there are no more functions to call, if you try to call next() 
//you would get an error, because at this point next() would be 
//undefined 

res.send(req.body) 
} 
相關問題