Node.js 如何添加新的ACL中间件?

Node.js 如何添加新的ACL中间件?,node.js,express,Node.js,Express,我正在通过IP ACL处理客户端访问 function localAcl (options) { let {allowedMethods} = options if (!Array.isArray(allowedMethods)) { allowedMethods = [] } return function(req, res, next) { if (allowedMethods.includes(req.method)) {

我正在通过IP ACL处理客户端访问

function localAcl (options) {
    let {allowedMethods} = options
    if (!Array.isArray(allowedMethods)) {
        allowedMethods = []
    }
    return function(req, res, next) {
        if (allowedMethods.includes(req.method)) {
            next()
        } else {
            (ipAccessControl(options))(req, res, next)
        }
    }
}

app.use('/api/v1', localAcl(options), apiV1Router)

上面的代码读取一个配置文件并决定是否接受

现在,我想添加一个新的中间件,它从web文件读取另一个配置文件并决定权限

function newAcl () {
    ...
    switch(result) {
        case SUCCESS:
            next();
            break;
        case FAIL:
            next(new Error('Access Denied'));
            break;
    }
}
//something like this..
我想先用localAcl检查权限

如果localAcl接受,我不希望检查newAcl,请求将得到处理

如果localAcl拒绝,我希望newAcl再次检查,如果newAcl接受,则应该处理请求

如何连接这两者?

我看到两个选项

  • 使用
    next('route')
    跳过中间件的其余功能
  • 以编程方式处理授权,让最后一个中间件决定
  • 对于您所描述的内容,第一个选项似乎是一个更好的选项

    跳过路由器中间件的其余中间件功能 堆栈,调用next('route')将控制权传递给下一个路由

    注: 下一步(“路由”)将仅在加载的中间件函数中工作 通过使用app.METHOD()或router.METHOD()函数


    这意味着您可能应该在
    ipAccessControl
    函数中调用
    next('route')

    lcoalac
    中间件中设置
    req
    对象的一些标志属性,例如
    req.localAcl.isAllowed=true
    。然后,您可以从
    newAcl
    中间件获取
    isAllowed
    属性值。