javascript - 快速处理所有中间件

标签 javascript express routes middleware

我正在使用express构建一个API,并且在我的路由中使用多个中间件。以下是我的端点之一

Router.route('/:id/documents')
  .get([isAuthenticated, isAdmin || isUserOwn], Users.getUserDocuments);

下面是我的中间件:

export const isAdmin = (req, res, next) => {
  if (req.decoded.role === 1) {
    next();
  } else {
    res.status(401).send({
      status: 'error',
      message: 'Only admins are authorized to access this resource',
    });
  }
};

export const isUserOwn = (req, res, next) => {
  if (req.decoded.userId === parseInt(req.params.id, 10)) {
    next();
  } else {
    res.status(401).send({
      status: 'error',
      message: 'Only the owner can access this resource',
    });
  }
};

我只希望文档的所有者和管理员有权访问该文档。我现在遇到的问题是,如果用户不是管理员,它会发送 isAdmin 响应,甚至不会到达 isUserOwn 中间件。我实际上考虑过将两者转换为一个中间件,但我也在其他路线上单独使用它们。我如何让它同时运行?

最佳答案

function isAdminOrisUserOwn(req,res,next){
  if(req.decoded.userId === parseInt(req.params.id, 10) || req.decoded.role === 1){
   next();
  }else{
   //error
  }
}
<小时/>

函数通常是真实的,所以

func1 || func2

等于

func1
<小时/>

解决方案可能是像上面这样的额外函数,或者是一个非常复杂的方法:

app.use(function(req,res,next){
 isAdmin(req,{ 
  status(code){
    isUserOwn(req,res,next);
    return this;
   },
   send(){}
  },next);
<小时/>

也许最优雅的方法是一些包装函数,例如:

function every(...funcs){
 return function(req,res,next){
   var every=false;
   funcs.reduce(function(func,middle){
     return function(){
       middle(req,res,func);
     }
   },_=>every=true);
  if(every) next() else res.error(404);
 };
}

function some(...funcs){
 return function(req,res,next){
   var some=false;
   if(funcs.some(function(middle){
          middle(req,res,_=>some=true);
          return some;
     }
   })) next() else res.error(404);
 };
}

所以你可以这样做:

app.use(some(isAdmin,isUserOwn),...);

关于javascript - 快速处理所有中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45350304/

相关文章:

javascript - 从文本框上的 onclick 函数调用时,datepicker() 在点击 2 次(而不是点击 1 次)后才起作用

node.js - 快速路线 : how to differentiate between url and parameter?

javascript - Angular 在 http 请求后不更新页面(范围问题?)

node.js - Sails.js 和 Mocha : Using supertest to create a new model

routes - 为什么 Blazor WASM 路由部署在服务器上后不使用正确的基本 URI? (NavigationManager.NavigateTo() 方法)

ruby-on-rails-3 - 在 route 将:id定义为不同于Rails 3中的id

php - 带接口(interface)的 Laravel 动态路由

javascript - 更改服务器发送事件的源(url)

javascript - 为什么 RaphaelJS 中的这个事件处理程序会立即运行?

javascript - 使用 multer 转发上传图像请求(javascript,express)