return语句如何在节点中工作

时间:2018-01-29 05:27:40

标签: node.js express

我是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) => {

});

1 个答案:

答案 0 :(得分:3)

这意味着checkPrivilege()是一个函数,当被调用时返回另一个函数。在这种情况下,它返回一个格式正确的函数,用作中间件处理程序。

因此,当调用checkPrivilege(x,y)时,它会返回另一个函数(尚未执行),然后可以用作中间件。

所以,当你看到这个:

router.post('/create', checkPrivilege('module', 'write'), (req, res, next) => {
    // code here
    next();
});

执行以下步骤:

  1. /create路由创建POST路由处理程序。
  2. 立即调用checkPrivilege('module', 'write'),并返回另一个函数,该函数将成为/create路由的中间件处理程序。
  3. 然后为中间件处理程序完成后运行的/create路由定义内联匿名路由处理函数。
  4. 为了清楚起见,也可以写成:

    // 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设置 - 因此更具可重用性。