這裏是我的代碼相關的部分,簡化了縮小的問題:對於SENDFILE問題在快遞中間件控制流量
app.use(middleware1);
app.use(middleware2);
function middleware1(req,res,next) {
...//get extension of request URL
switch (extension)
{
case 'js' :
..
case 'html': res.sendFile(res.originalUrl,function(err) {});
break; //break1
case 'njm' : break; //break2
default : console.log('default');
break;
}
}
function middleware2(req,res,next) {
console.log("I am in middleware2");
}
的問題是:如果擴展HTML,例如,我不會期待中間件2被調用,但它確實! 看來,sendFile啓動文件的發送和控制執行落在sendFile的回調被調用之前。如果我用next()或return next()替換break1,那麼它會有同樣的缺陷 - 在執行sendFile的回調之前,控件將轉到下一個中間件2。如何阻止中間件2被第一組擴展調用?另外,如果擴展是'njm',即使沒有下一個(),中間件2也會被調用。爲什麼?
請不要建議使用Express靜態中間件,因爲我有一些邏輯涉及提供不同的文件類型,這與上面提供的簡化場景相比更爲複雜。
你指出了一些非常有用的見解。我會仔細看看的。它按照文檔描述的方式工作,使用我自己的異步調用(以下是調用數據庫的方式),這與Vineet描述的方式相同:在未調用異步的下一個調用時,未明確調用下一個中間件。在這裏,當調用sendFile異步時,控制權直至下一個中間件。我已經調試了很多次,不過只使用console.log。我有一個簡單的解決方法,在sendFile()之前設置一個標誌,然後在繼續使用第二個中間件之前檢查它,但這很笨拙。 – Sam
@Samir - 如果你看看'res.sendFile()'代碼[這裏](https://github.com/strongloop/express/blob/master/lib/response.js#L417),你可以看到'res.sendFile()'在某些情況下調用'next()'本身,儘管它看起來像是將一個回調傳遞給'sendFile()',那麼它不會這樣做。 – jfriend00
你可以編輯你的答案,突出顯示並解釋。我會接受它。我要求你這樣做的原因是,可能有其他人可能面臨同樣的問題。在我將評論發佈到Vineet後,我閱讀了您的正義評論。 – Sam