我遇到了这段需要澄清的代码。http://expressjs.com/en/guide/writing-middleware.html: ~:文本= % 20下% 20% 28% 29% 20函数% 20 % 20不是% 20 % 20的一部分,% E2 % 9 cnext % E2 % 80% 80% 9 d % 20 % 20避免% 20混乱% 2 c % 20总是% 20使用% 20 % 20大会。参考章节:"可配置中间件">
怎么可能"要求","回复";和";next"可以在导出函数中直接引用吗?我的意思是调用者app。use()"也不是CB导出定义模块。= function(options){}"有任何参考
-----块使用导出的中间件----
const mw = require('./my-middleware.js');
app.use(mw({ option1: '1', option2: '2' }))
}
------导出功能--------
module.exports = function (options) {
// Please explain the below access/visibility of req, res and next parameters.
// I do not see them passed/referred/handed-down from app.use() level.
return function (req, res, next) {
// Implement the middleware function based on the options object
next()
}
每个快速中间件函数都可以访问request
,response
和一个回调函数,通常命名为next
。
中间件如何访问这些?当您将一个函数注册为中间件时,express将上述参数作为参数传递给该中间件函数。
因此,当您创建一个函数并打算将其用作中间件时,您已经知道它将从express接收三个参数。因此,您将创建一个具有上述3个参数的函数:
function myMiddleware(req, res, next) {
...
}
有时,我们希望中间件功能是可配置的;因此,我们创建一个接受一些配置选项的函数,然后返回一个将用作中间件函数的函数。
我们知道每个中间件函数将通过express传递3个参数,因此我们定义内部函数接受3个参数:
function returnConfigurableMiddleware(options) {
...
return (req, res, next) => {
...
}
}
在这种情况下,为了注册中间件,我们必须调用返回作为中间件使用的函数的函数。
app.use(returnConfigurableMiddleware(...))
试着这样想:导出函数定义了一个接受(req, res, next)作为参数的函数。
通常在定义函数时,对如何定义参数没有限制。
但是,在这种情况下,参数必须是(req, res, next),因为您正在定义一个快速中间件
调用者[…]也没有CB出口定义[…]]有任何参考资料
这是因为所示代码中没有任何内容调用该函数。导出一个函数,该函数返回一个函数。外部函数在这里被调用:
mw({ option1: '1', option2: '2' })
返回一个函数,但不调用该函数。它只是将它作为唯一的参数传递给app.use()
。
根据用法,假定app
是一个Express对象,它的.use()
函数是如何为Express web服务器构建中间件。
因此,在Express的内部工作中,作为HTTP请求/响应管道的一部分,it将在稍后的某个时间调用function (req, res, next)
。当它这样做时,it将传递(至少)三个参数给该函数。