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

zxc*_*cvb 5 node.js express

我想拥有受保护和不受保护的路由,并使其成为未定义路由的请求将返回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);
Run Code Online (Sandbox Code Playgroud)

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

msc*_*dex 6

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

// 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');
});
Run Code Online (Sandbox Code Playgroud)

您甚至可以通过在单独的路由器中定义所有路由然后执行类似的操作来对一组路由执行此操作router.use('/api', checkAuth, apiRouter)

此外,默认情况下,如果没有路由匹配,Express 将使用 404 进行响应,因此您无需明确发送它。