【问题标题】:Middleware Called before any request in ExpressJS在 ExpressJS 中的任何请求之前调用的中间件
【发布时间】:2020-12-14 18:01:34
【问题描述】:

我正在开发 NodeJS Api 并且遇到了一些中间件问题。 用户可以根据角色访问路由,角色可以是管理员或超级管理员。 我的权限中间件如下所示:

permission.js

// middleware for doing role-based permissions
const { getRoleName } = require('../../constants/roles');
module.exports = function permit(...allowed) {
    const isAllowed = role => allowed.indexOf(role) > -1;
    console.log(isAllowed)
    // return a middleware
    return (req, res, next) => {
        //findRole Name

        if (req.user && isAllowed(getRoleName[req.user.role]))
            next(); // role is allowed, so continue on the next middleware
        else {
            res.error({ code: 403, message: 'Forbidden', errors: ['Permission Denied'] }); // user is forbidden
        }
    }
}

我还有一个身份验证中间件,它将登录用户附加到req.user。 我在我的路由中使用这个基于权限的中间件,就像这样。

records.js
const permit = require("../middlewares/permissions/permission"); 
router.get("/", permit("superAdmin"), getAllRecords);
router.get("/route1", permit("admin"), getRouteOneRecords);
router.get("/route2", permit("admin","superAdmin"), getRouteTwoRecords);

现在的问题是当我的应用程序运行时,所有角色都在打印而不发出任何请求, console.log(isAllowed),permission.js 中的这一行正在打印角色,而对任何路由都没有任何请求。

我想知道为什么会发生这种情况,甚至在向路由发出请求之前。

【问题讨论】:

    标签: node.js express middleware


    【解决方案1】:

    仅仅因为在每个路由中你都在执行 permit() 方法,在其中你在返回中间件函数之前执行这个块:

    const isAllowed = role => allowed.indexOf(role) > -1;
        console.log(isAllowed)
        // return a middleware
    

    但可以肯定的是,当你执行路由时,这个函数return (req, res, next) => {的内容将作为中间件目的执行。

    【讨论】:

    • 但只有在我向该路由传递请求后才应该触发它。对吗?
    • 是的,只有中间件内部的回调函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2014-04-12
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多