源代码中的节点表达请求处理程序
node express request handler in source code
我正在阅读示例 express 源代码以供学习。
初始化一个简单的 express 应用程序如下所示:
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 被用作请求处理程序。
引擎盖下发生了什么?
感谢您的宝贵时间!
this
是 app
原型的增强实例,它被用作 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 模块进行交互。该模块 仅 曾经被 Express 在 lib/express 内部使用过,在实例化之前它与另一个 JavaScript 原型混合在一起。一旦成为实例,lib/application 中的每个 app
函数共享一个 this
,可用于引用其原型上的每个 属性 值和函数。
所以...
因为 http.createServer
接受选项对象作为其第一个参数,ServerResponse
& IncomingMessage
将在 app
/this
可用时使用。
P.S。 不要 以 Express 团队的方式编写代码。您永远不需要浏览多个模块来找到像这样的简单问题的答案。有更简单和团队友好的方法来模块化原型混合和默认初始化选项!
我正在阅读示例 express 源代码以供学习。
初始化一个简单的 express 应用程序如下所示:
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 被用作请求处理程序。
引擎盖下发生了什么?
感谢您的宝贵时间!
this
是 app
原型的增强实例,它被用作 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 模块进行交互。该模块 仅 曾经被 Express 在 lib/express 内部使用过,在实例化之前它与另一个 JavaScript 原型混合在一起。一旦成为实例,lib/application 中的每个 app
函数共享一个 this
,可用于引用其原型上的每个 属性 值和函数。
所以...
因为 http.createServer
接受选项对象作为其第一个参数,ServerResponse
& IncomingMessage
将在 app
/this
可用时使用。
P.S。 不要 以 Express 团队的方式编写代码。您永远不需要浏览多个模块来找到像这样的简单问题的答案。有更简单和团队友好的方法来模块化原型混合和默认初始化选项!