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

时间:2012-06-19 14:45:25

标签: javascript 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()?用法很简单:需要上面的模块,每次调用它。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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