簡體   English   中英

next()在Node.js中如何工作?

[英]How does next() work in Node.js?

我最近在Nodejitsu上閱讀了一個博客,我想知道這段代碼是如何工作的。

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()的上述方法中的代碼? 用法非常簡單:需要上述模塊,並且每次都會調用它。

我將簡化實際過程,但要點是:

當請求進入時,節點將請求和響應對象傳遞給中間件堆棧中的第一個中間件。 如果該中間件以任何方式發送響應或關閉連接,則不會調用后續的中間件。 否則,該中間件必須告知節點它已經完成了繼續在中間件堆棧中移動的工作,因此您在中間件中調用next()來告訴它繼續處理中間件。

好的,這是很常見的事情。 此模塊包含的內容是此行指定的單個函數,其中我們將module.exports設置為一個模塊, module.exports = function (logging) { 模塊返回的函數(並因此由require()返回)返回另一個函數,該函數是HTTP代理的中間件(該中間件允許您轉換請求)。 對於服務器發出的每個HTTP請求,都會調用此中間件功能。 Quickredfox的答案很好地解釋了中間件。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM