0

我最近在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()在每个请求中调用?用法很简单: require 上面的模块,它每次都会被调用。

4

2 回答 2

2

我将简化实际过程,但它的要点:

当请求进来时,节点将请求和响应对象传递给中间件堆栈中的第一个中间件。如果该中间件以任何方式发送响应或关闭连接,则不会调用后续中间件。否则,该中间件必须告诉节点它完成了继续在中间件堆栈中移动的工作,因此您在中间件中调用 next() 以告诉它继续处理中间件。

于 2012-06-19T15:09:32.830 回答
1

好的,所以这是一个很常见的事情。这个模块包含的是一个函数,由这一行指定,我们将 module.exports 设置为一个函数,module.exports = function (logging) {. 模块返回的函数(因此返回require())返回另一个函数,它是 HTTP 代理的中间件(这个中间件允许您转换请求)。对于向服务器发出的每个 HTTP 请求,都会调用此中间件函数。Quickredfox 的回答对中间件提供了相当好的解释。

所以require('./example-middleware')(true)实际调用分配给的函数module.exports,但不调用其中的函数,该函数立即返回并作为中间件传递给httpProxy.createServer函数。这是使用闭包为中间件设置一些选项的好方法。如果您还有任何问题,请随时发表评论。:D

于 2012-06-19T15:44:10.253 回答