node.js - 基于用户角色的中间件返回适当的 HTTP 响应状态代码

标签 node.js express

我正在为 admin 用户创建一个中间件:

let admin_middleware = (req, res, next) => {
    let token = req.header('x-auth');

    User.findByToken(token).then((user) => {
        if(!user || user._doc.user_type !== user_roles.admin)
            return Promise.reject();

        req.user = user;
        req.token = token;
        next();
    }).catch((e) => {
        res.status(401).send();
    })
};

问题围绕着这行代码:

if(!user || user._doc.user_type !== user_roles.admin)
        return Promise.reject();

server.js 中使用 admin_middleware 时,我发现了被拒绝的 promise :

.catch(e => {
    res.status(401).send();
})

这意味着对于用户 未授权 和“禁止访问”,我返回 401 状态代码。

我想在一种情况下返回 403,在另一种情况下返回 401。解决方案是什么?

谢谢!

最佳答案

如评论中所建议。您可以像这样拒绝自定义错误:

class UnauthorizedError extends Error {}
class ForbiddenError extends Error {}

let admin_middleware = (req, res, next) => {
  let token = req.header('x-auth');

  User.findByToken(token).then((user) => {
    if (!user) return Promise.reject(new UnauthorizedError());
    if (user._doc.user_type !== user_roles.admin) return Promise.reject(new ForbiddenError());

    req.user = user;
    req.token = token;
    next();
  }).catch((e) => {
    if (e instanceof  UnauthorizedError) {
      res.status(401);
    } else if (e instanceof ForbiddenError) {
      res.status(403);
    } else {
      res.status(500);
    }
    res.send();
  })
};

关于node.js - 基于用户角色的中间件返回适当的 HTTP 响应状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52102880/

相关文章:

Node.js 重定向到另一个 Node.js 文件

javascript - 我如何知道最后一个异步操作何时完成?

javascript - MongoDB:如何按值查找键

javascript - Node webkit : How to open external link with system default browser in MAC

node.js - 从 Angular2 应用程序链接到全局 Node 模块文件夹

JavaScript 错误未显示在控制台中?

node.js - Node/Express,如何将 bodyParser 配置为仅在某些路由上使用 raw

javascript - 数据库或数组

javascript - Express - 无法连接到 MongoDB 服务器

node.js - 表达通配符规则