源代码中的节点快速请求处理程序

时间:2018-08-23 09:50:37

标签: node.js express requesthandler

我正在阅读示例express的教育源代码。

初始化一个简单的快速应用程序看起来像这样:

const express = require('express')
const app = express()

app.listen(3000, () => {
  console.log(`http://localhost:3000`)
})

我想了解以上代码中app.listen的作用。

express/lib/application.js中定义了app.listen的源代码,如下所示:

var app = exports = module.exports = {};

// ...

app.listen = function listen() {
  var server = http.createServer(this); // <-- why `this` ??
  return server.listen.apply(server, arguments);
};

通常,http.createServer()接受一个函数作为请求处理程序。在这种情况下,传递了this。但是this应该引用app,它不是函数,对吗?

后来我发现app.handle被用作请求处理程序。

引擎盖下发生了什么事?

感谢您的时间!

1 个答案:

答案 0 :(得分:1)

thisapp原型的增强实例,并且被用作http.createServer的选项对象。要跟踪这种答案,我们需要充分了解Node的CommonJS模块实现,JavaScript原型继承系统和JavaScript函数范围。

答案在于以下几行: https://github.com/expressjs/express/blob/4.16.3/lib/application.js#L38 https://github.com/expressjs/express/blob/4.16.3/lib/express.js#L43

app是指向module.exports的指针,它表示该模块如何与其他Node模块建立接口。该模块仅由lib / express中的Express内部使用过,仅在临时实例化之前与另一个JavaScript原型混合使用。一旦成为实例,lib / application中的每个app函数将共享一个this,可用来引用其原型上的每个属性值和函数。

所以...

由于http.createServer接受一个options对象作为其第一个参数,因此ServerResponse / IncomingMessage中将使用appthis

P.S。 不要以Express团队的方式编写代码。您永远不需要遍历几个模块来找到像这样的简单问题的答案。有很多更简单且团队友好的方法来模块化原型mixins和默认的初始化程序选项!