如何将参数传递给Express JS中的中间件功能?

时间:2018-10-04 13:34:29

标签: node.js express routes

// state edit route
app.get("/map/:symbol/edit", isLoggedIn, function(req, res){
  State.findOne({symbol: req.params.symbol}, function(err, state){
    if(err){
      console.log(err);
    } else
    {
      res.render("edit", {state: state});
    }
  });
});

在上面的代码片段中, isLoggedIn 是用于检查身份验证的中间件功能。其定义如下:

// middleware function
function isLoggedIn(req, res, next){
  if(req.isAuthenticated()){
    return next();
  }
  res.redirect("/admin");
}

所以,问题是,如何将诸如字符串,整数或路径变量之类的参数传递给中间件函数,以便可以在路由URL中使用它?

3 个答案:

答案 0 :(得分:11)

我有相同的要求,这种方法对我有用。

中间件文件validate.js

exports.grantAccess = function(action, resource){
    return async (req, res, next) => {
        try {
            const permission = roles.can(req.user.role)[action](resource);
            // Do something
            next();
        }
        catch (error) {
            next(error)
        }
    }
}

route 文件中使用中间件。 grantAccess('readAny', 'user')

router.get("/",grantAccess('readAny', 'user'), async (req,res)=>{
    // Do something     
});

答案 1 :(得分:0)

遵循这种方法,它可能会为您完成工作

app.use(function(req, res, next){
    console.log(req);
    this.req = req;
    // assign value like this
    this.req.body.custom_data = ['zz', 'aaa', ....];
    next();
});

app.get("/map/:symbol/edit", isLoggedIn, function(req, res){
   State.findOne({symbol: req.params.symbol}, function(err, state){
      if(err){
         console.log(err);
      } else {
         res.render("edit", {state: state});
      }
   });
});

function isLoggedIn(req, res, next){
   console.log(req.body);
   if(req.isAuthenticated()){
      return next();
   }
   res.redirect("/admin");
}

答案 2 :(得分:0)

这就是我的使用方式,我听了Hardik Raval的回答。

helpers.validateRole = (roles) => {
    return async (req, res, next) => {
        try {
            const authHeader = req.headers['authorization']
            const token = authHeader && authHeader.split(' ')[0]
            if (token == null) return res.json({error:true, msg: "Unauthorized"})
            const user = jwt.decode(token)
            let isValid = false
            roles.map((r,i)=>{
                if (r === user.role){
                    isValid = true
                }
            })
            if (isValid){
                // User role is valid
                next();
            }else{
                // User role is not valid
                util.returnError("Unauthorized", res);
            }
        }
        catch (error) {
            next(error)
        }
    }
}

我这样叫。

router.get(  "/requirements/list_of_requirements/:page/:rows",  isAuthenticated, validateRole([6]),  async (req, res) => {
//* All the logic
})