我是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();
});


这样做的典型原因是,这是使某些参数stateNameforPrivilege对中间件可用的简单方法,而无需创建另一个内联函数主体。这样,可以在代码中的多个位置使用checkPrivilege()函数,每个位置都有自己的stateNameforPrivilege设置-因此更具可重用性。

10-08 01:00