【问题标题】:How does next() work in Node.js?Next() 在 Node.js 中是如何工作的?
【发布时间】:2026-01-27 04:50:01
【问题描述】:

我最近在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 上面的模块,每次都会被调用。

【问题讨论】:

  • 由于 Node 是单线程的,我想“next”只是设置了一个超时,以便在新请求进来时再次调用相同的函数。
  • @ChristopherHarris 不完全是。 next() 告诉调用这个函数的人它已经完成并且应该调用中间件堆栈中的下一个函数。
  • @chasles,谢谢。听起来它仍然设置了一个超时来调用相同的函数。调用堆栈中的“相同”函数可能比之前建议的要高一点。

标签: javascript node.js


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】: