2012-06-19 50 views
0

我最近在Nodejitsu上看過博客,我在想這段代碼是如何工作的。next()如何在Node.js中工作?

var fs = require('fs'), 
http = require('http'), 
httpProxy = require('../lib/node-http-proxy'); 


module.exports = function (logging) { 
    // Code here is run when the middleware is initially loaded. 
    var logFile = fs.createWriteStream('./requests.log'); 

    return function (request, response, next) { 
    // Code here is run on each request. 
    if (logging) { 
     logFile.write(JSON.stringify(request.headers, true, 2)); 
    } 
    next(); 
    } 
} 

而對於這段代碼給出的解釋是:

這個中間件是非常簡單的日誌 - 它將每個請求的標頭寫入日誌文件。

出口可以用作上述模塊,

httpProxy.createServer(
    require('./example-middleware')(true), 
    8000, 'localhost' 
).listen(9000) 

如何與next()上述方法的代碼在每個請求中引用?用法非常簡單:需要上述模塊,並且每次都會調用它。當收到請求時,節點將請求傳遞和響應目的是在中間件堆疊中的第一中間件

+0

由於節點是單線程的,我想「下一個」只是設置一個超時來在新請求進來時再次調用相同的函數。 –

+2

@ChristopherHarris不完全。 'next()'告訴誰調用這個函數完成它,並且中間件堆棧中的下一個函數應該被調用。 – chesles

+0

@chasles,gratzi。仍然聽起來像它設置超時調用相同的功能。調用堆棧中的「相同」函數可能稍微高於之前的建議。 –

回答

2

我將簡化的實際過程,但它的要點。如果該中間件以任何方式發送響應或關閉連接,則不調用後續中間件。否則,該中間件必須告訴節點它已經完成了繼續在中間件堆棧中移動的工作,因此您需要在中間件中調用next()來告訴它繼續處理中間件。

1

好的,所以這是一件很常見的事情。這個模塊包含的是一個單獨的函數,由這條線指定,我們將module.exports設置爲一個函數module.exports = function (logging) {。模塊返回的函數(因此返回require())返回另一個函數,它是HTTP代理的中間件(該中間件允許您轉換請求)。這個中間件函數被調用,用於向服務器發出的每個HTTP請求。 Quickredfox的答案對中間件提供了一個相當好的解釋。

因此require('./example-middleware')(true)實際上調用分配給module.exports的函數,但不會調用該函數,該函數立即返回並作爲中間件傳遞到httpProxy.createServer函數中。這是使用閉包爲中間件設置一些選項的好方法。如果您有任何問題,請隨時發表評論。 :D