我是ExpressJs的新手,我不清楚中间件的返回声明。请看下面的代码:
middleware.js
exports.checkPrivilege = (stateName, forPrivilege) => {
return (req, res, next) => { // THIS LINE MAKE CONFUSE, i.e, req, res and next
}
}
module.js
.....
.....
router.post('/create', checkPrivilege('module', 'write'), (req, res, next) => {
});
最佳答案
这意味着checkPrivilege()
是一个函数,当被调用时将返回另一个函数。在这种情况下,它将返回正确格式的函数以用作中间件处理程序。
因此,在调用checkPrivilege(x,y)
时,它将返回另一个函数(尚未执行),该函数可以用作中间件。
因此,当您看到以下内容时:
router.post('/create', checkPrivilege('module', 'write'), (req, res, next) => {
// code here
next();
});
这将执行以下步骤:
为
/create
路由创建POST路由处理程序。立即调用
checkPrivilege('module', 'write')
,并作为返回值返回另一个函数,该函数成为/create
路由的中间件处理程序。然后为
/create
路由定义一个内联匿名路由处理程序函数,该函数将在中间件处理程序完成后运行。为了清楚起见,也可以这样写:
// create middleware function
let checkPrivilegeMiddleware1 = checkPrivilege('module', 'write');
// create route handler with middleware
router.post('/create', checkPrivilegeMiddleware1, (req, res, next) => {
// code here
next();
});
这样做的典型原因是,这是使某些参数
stateName
和forPrivilege
对中间件可用的简单方法,而无需创建另一个内联函数主体。这样,可以在代码中的多个位置使用checkPrivilege()
函数,每个位置都有自己的stateName
和forPrivilege
设置-因此更具可重用性。