我是ExpressJs的新手,我不清楚中间件的返回声明。请参阅以下代码: -
exports.checkPrivilege = (stateName, forPrivilege) => {
return (req, res, next) => { // THIS LINE MAKE CONFUSE, i.e, req, res and next
}
}
.....
.....
router.post('/create', checkPrivilege('module', 'write'), (req, res, next) => {
});
答案 0 :(得分:3)
这意味着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
设置 - 因此更具可重用性。