2016-10-10 37 views
-1

我對Express很熟悉,但對Restify很陌生。的RESTify的文件有許多例子呼籲res.send()如下之後next()Resitfy中res.send()之後調用next()有什麼意義?

server.get('/echo/:name', function (req, res, next) { 
    res.send(req.params); 
    return next(); 
}); 

這看起來像一些的RESTify專家以及推薦模式:

The consequences of not calling next() in restify

什麼是這樣做的實際使用情況?在你打電話給res.send()之後,有沒有鏈條中的下一個處理程序可以做的事情?

+0

當然,它可能會做額外的數據庫工作或請求跟蹤等,但是......如果您沒有這樣做,爲什麼要調用.next?這樣做可以使未來的處理程序可以在您不返回的情況下繼續工作,因爲無論如何,調用.next並沒有真正的傷害,只要知道如果多條路線碰巧發生了相同的請求,則只有其中一個可以成功調用'res.send',第二個會導致錯誤。 –

+1

@Kevin B:謝謝你的回答。這就是'後期渲染'類型中間件的情況,對吧?請閱讀我的意見,讓我知道你的想法。 – Max

+0

正確。我同意你的結論,只有當你知道你在做什麼時才這樣做。 –

回答

1

當我做了一些更多的研究後,我想我找到了答案。

只有在res.send()之後調用next()的實際用例是,當您想安裝'post-render'類型中間件以在路由handers完成作業後捕獲所有事務。

在其他情況下,它只是爲每個請求和每個請求添加不必要的開銷,因爲它會掃描其餘路由以查找下一個匹配。

大多數中間件都是「預渲染」類型,無論如何都不需要調用next()。即使對於後渲染類型的中間件,依賴於next()的自願調用也是非常危險的。您寧願要使用更多防錯方法,如https://github.com/jshttp/on-finished

res.send()之後調用next()在大多數情況下會導致不必要的開銷。只有在絕對需要時才能使用它,並且知道自己在做什麼。

+0

感謝您的洞察力 - 我認爲應該指出,特別是如果您使用任何時間或日誌記錄行爲,那麼您可能總是需要在send()之後調用next() - 性能開銷或不。因此,如果你是一位圖書館作者,請閱讀此內容..請彬彬有禮,並調用'next()',以便在導入模塊時不會無意中破壞人們的應用程序。 – pospi