【问题标题】:Express middleware protected and unprotected routesExpress 中间件受保护和不受保护的路由
【发布时间】:2016-01-12 18:17:55
【问题描述】:

我在/users 下有一些需要身份验证令牌的路由,而有些则不需要。为了实现这一点,我做了以下工作。

var protected = express.Router();
var unprotected = express.Router();

unprotected.post('/', function(req, res, next) { // A
   // no auth required
   next();
});

protected.get('/', function(req, res, next) { // B
   // auth required
   next();
});

module.exports = {
    protected: protected,
    unprotected: unprotected
};

然后我按以下方式安装这些路由。

var users = require('./routes/users');

app.use('/users', unprotected_middleware, users.unprotected); // C
app.use('/users', protected_middleware, users.protected); // D

app.use(resultHandler); // Middleware for sending the response (all routes) 
app.use(errorHandler);  // Middleware for handling errors (all routes)

当我向/users 发送 POST 时,它会运行预期的路线,但是当 next() 被调用时,protected_middleware 会运行。发生这种情况是因为它在标有“D”的行中找到了下一个 /users 定义。

解决此问题的推荐方法是什么?

对于每个资源,我希望每个路由都有不同的中间件。

POST /users           (no auth)
GET /users            (requires auth)
DELETE /users/{id}    (requires auth and admin access)

【问题讨论】:

  • 如果你有处理错误的中间件,你试过next( new Error('crap') )
  • 是的,中间件按预期工作以处理错误。

标签: node.js express middleware


【解决方案1】:

您在这里不需要两个单独的路由器,只需在需要的地方(在路由器的 get/post 函数中)使用受保护和不受保护的中间件:

users.js:

var router = express.Router();

router.post('/', unprotected_middleware, 
   function(req, res, next) { // A
     // no auth required
     next();
  }
);

router.get('/', protected_middleware, 
    function(req, res, next) { // B
      // auth required
      next();
    }
);
module.exports = router;

然后:

var users = require('./routes/users');

app.use('/users', users);

app.use(resultHandler); // Middleware for sending the response (all routes) 
app.use(errorHandler); 

【讨论】:

  • 酷,这是我正在探索的潜在解决方案之一。似乎是一个不错的合理解决方案。
猜你喜欢
  • 2022-11-16
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 2016-08-22
  • 2020-10-26
  • 2019-05-31
  • 1970-01-01
相关资源
最近更新 更多