仅当路由匹配后才表示中间件



我想要有受保护的和未受保护的路由,并使其使对未定义路由的请求即使在用户未经过身份验证的情况下也会返回404。我遇到的问题是,除了在它之前定义的路由之外,身份验证中间件在所有路由上运行,因此任何未定义的路由都会返回身份验证失败,而不是404。下面是这个问题的一个例子:

var app = express();
var router = express.Router();
router.get('/', function(req, res) {
  res.send('unprotected route');
});
// best auth ever
router.use(function(req, res, next) {
  if(req.body.token) {
    return next();
  }
  res.send('auth failed');
});
router.get('/protected', function(req, res) {
  res.send('protected route');
});
/// catch 404
router.use(function(req, res) {
  res.sendStatus(404);
});
app.use('/', router);

在这种情况下,没有令牌的请求到随机路由(例如/什么的)将返回'auth failed'而不是404。如何在Express中解决这个问题?

一种解决方案是将身份验证中间件移到路由处理程序之前的路由中:

// best auth ever
function checkAuth(req, res, next) {
  if(req.body.token) {
    return next();
  }
  res.send('auth failed');
}
router.get('/protected', checkAuth, function(req, res) {
  res.send('protected route');
});

你甚至可以在一个单独的路由器中定义所有的路由,然后像router.use('/api', checkAuth, apiRouter)那样对一组路由这样做。

而且,默认情况下,如果没有路由匹配,Express将响应404,所以你不需要显式地发送它。

最新更新