2017-09-09 47 views
0

我只是想了解中間件的含義。起初我認爲它是在框架表達中使用的函數。雖然現在我明白了他們只是簡單地提到了在異步函數之間處於中間位置的函數。貓鼬的中間件是否也指express的中間件?

我知道通常看到next()習慣從一箇中間件移動到下一個。 express和mongoose都具有類似名稱的next()調用。我很擔心,因爲我沒有看到貓鼬或在他們的文檔中彼此表達。所以這讓我相信他們的中間件的背景僅僅是爲了他們自己。

http://mongoosejs.com/docs/middleware.html
http://expressjs.com/en/resources/middleware.html

當組合表達對貓鼬的所有中間件列隊在一起/級聯抑或是分開的?

例如一起/級聯
- 在貓鼬上調用next()也將觸發表達中間件功能

例如,獨立
- 貓鼬只是有它的中間件next()的正義之舉的前/後鉤
- 快遞也只是有它的中間件的next()只是邁向它支持的中間件功能

回答

0

簡短的回答:他們分離。

較長的答案:按照慣例,大多數中間件棧實現某種next功能,以繼續向下堆棧並調用反過來每個中間件功能調用。

這是一個範圍問題。 Express和Mongoose都有自己的獨立中間件堆棧,因此next函數的作用取決於它被調用的位置。根據一般經驗,每個函數(包括用於接受next參數的回調函數的匿名函數)都有其自己的範圍。

考慮下面的真正簡單的例子的不同範圍,但在其他方面相同的參數名:

function doSomething(arg) { 
    console.log(arg) 

    function doSomethingElse(arg) { 
     console.log(arg); 
    } 

    doSomethingElse('different'); 
} 

doSomething('original'); 
// Outputs 
// > 'original' 
// > 'different 

即使doSomethingdoSomethingElse都有一個叫arg參數,通過doSomethingElse登錄到控制檯的值是值實際上已傳遞給該函數--的值作爲調用函數的範圍,而不是圍繞它的作用域。

對於在Express中間件中應用的Mongoose中間件(反之亦然),這是正確的:它們恰好共享一個類似的常規參數名稱。

作爲一個學習的實驗,你應該從約定偏離了一會兒(但不是永遠;!是有原因的存在約定)命名您的快遞和你的貓鼬next其他參數在單一file-- expressNextmongooseNext東西,也許 - 幫助您區分他們。

+1

對不起,我不能馬上回復,但感謝這個答案。這真的很有幫助。 :) – Jonathan002