首页 > 解决方案 > 父路由器的中间件未在子路由器中执行

问题描述

我的 expressjs 服务器中有 2 个路由器。一个是主要的,它具有以下中间件:

app.use(function (req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type,x-auth-token');
  res.setHeader('Access-Control-Allow-Credentials', true);
  res.setHeader('Access-Control-Expose-Headers', 'x-auth-token');
  next();
});

然后是这条路线:app.use('/restaurants', restaurant_router);

在里面restaurant_router我有: router.use('/:restaurant_id/orders', restaurant_order_router);

在里面restaurant_order_router我有一个获取请求。

现在发生的情况是,当我发送请求时GET /restaurants,它首先发送一个 OPTIONS 请求,因为我发送x-auth-token了标头,然后它发送了 GET 请求。

但是当我尝试使用相同的标头并向子路由器发送请求时,GET /restaurants/:restaurant_id/order它会失败并显示 500 并说没有 http ok 状态。

我查看了问题,发现如果我添加app.options('*', (req, res) => res.sendStatus(200));根路由器,它就会开始工作。

为什么会这样?为什么我必须自己设置这个选项?为什么它不像处理GET /restaurants请求那样工作?

标签: javascriptnode.jsexpress

解决方案


如果您将所有相关代码添加到您的问题中,我们可以肯定地看到,但似乎在 OPTIONS 请求中,您在中间件中适当地设置了标头,但是您没有任何发送 2xx 响应的路由选项请求。这意味着它可能会落入默认的 404 处理程序。

另一方面,当您添加显式处理程序时:

app.options('*', (req, res) => res.sendStatus(200));

然后,您添加的内容将为 OPTIONS 请求返回 200 状态。所以,这似乎是缺失的部分。你也可以这样做:

app.use(function (req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type,x-auth-token');
  res.setHeader('Access-Control-Allow-Credentials', true);
  res.setHeader('Access-Control-Expose-Headers', 'x-auth-token');
  if (req.method === "OPTIONS") {
    res.sendStatus(200);
  } else {
    next();
  }
});

请记住,此中间件允许任何网页使用此服务器。您可能希望将其限制在您的特定域中。


推荐阅读