将参数传递给Function Express JS

时间:2018-09-22 04:01:33

标签: javascript node.js express

一切都好吗?我想知道最好的方法,以及是否可以将某个参数发送到NodeJS中的express函数。

我想使用我的路由传递字符串('admin')或其他我想运行'RoleTolen'的字符串。

功能verifyToken

function verifyToken(req, res, next) {
  // Get auth header value
  const bearerHeader = req.headers["authorization"];
  // Check if bearer is undefined
  if (typeof bearerHeader !== "undefined") {
    // Split at the space
    const bearer = bearerHeader.split(" ");
    // Get token from array
    const bearerToken = bearer[1];
    // Set the token
    req.token = bearerToken;
    // Next middleware
    next();
  } else {
    // Forbidden
    res.sendStatus(403);
  }
}

功能ValidToken

function validToken(req, res, next) {
  jwt.verify(req.token, process.env.SECRET, (err, authData) => {
    if (err) {
      res.sendStatus(403);
    } else {
      next();
    }
  });
}

功能RolesToken

function rolesToken(role, req, res, next) {
  var decoded = jwt.decode(req.token);
  if (!decoded.permissions.includes(role)) {
    res.json("sem permissao");
  } else {
    next();
  }
}

我的路线

router.post(
  "/posts",
  verifyToken,
  validToken,
  rolesToken("admin"),
  customerController.posts
);

2 个答案:

答案 0 :(得分:1)

如您所知,

function rolesToken(role, req, res, next)不是一个正确的Express.js路由处理程序(因此,我想是一个问题)。

您可以做的是将rolesToken编写为一个函数,该函数返回实际的Express.js兼容处理程序(函数):

function rolesToken(role) {
  return function(req, res, next) {
    var decoded = jwt.decode(req.token);
    if (!decoded.permissions.includes(role)) {
      res.json("sem permissao");
    } else {
      next();
    }
  };
}

答案 1 :(得分:0)

来自docs 以与其他中间件函数相同的方式定义错误处理中间件函数,除了使用四个参数而不是三个参数外,特别是使用签名 $('#element-in-parent-frame', window.parent.document).get(0).scrollIntoView();

因此,您的RolesTaken函数将无法正常工作。

第二,您可以创建中间件或修改现有的中间件

(err, req, res, next)):

现在,您可以在控制器中间件的req.someProp中以(req, res, next) => { //some stuff if(req.path == '/posts') req.role= 'admin'; if(req.path == '/someOtherPath') req.role= 'someRole'; //some other stuff } 的身份获得角色

您也想see this question