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



我正在阅读示例快速源代码。

初始化一个简单的快速应用程序如下所示:

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

我想了解app.listen在上面的代码中做了什么。

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

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被用作请求处理程序。

引擎盖下发生了什么?

谢谢你的时间!

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接受选项对象作为其第一个参数,因此如果可用,将从app/this开始使用ServerResponseIncomingMessage

附言:不要像Express团队那样编写代码。您永远不需要浏览多个模块来找到像这样的简单问题的答案。有更简单和团队友好的方法来模块化原型混合和默认初始值设定项选项!

最新更新