javascript - 父路由器的中间件未在子路由器中执行
问题描述
我的 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
请求那样工作?
解决方案
如果您将所有相关代码添加到您的问题中,我们可以肯定地看到,但似乎在 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();
}
});
请记住,此中间件允许任何网页使用此服务器。您可能希望将其限制在您的特定域中。
推荐阅读
- shell - 将部分 getopts 共享为函数
- apache-spark - Spark-Streaming 最早因 kafka 起始偏移而挂起(Kafka 2,spark 2.4.3)
- python - 在“with”语句中检索代码
- pytorch - Pytorch张量乘法与浮点张量给出错误答案
- git - Git无法在http代理后面的dockerfile中工作
- html - min-height 导致填充被忽略
- javascript - React 中进出 CSS 转换的不同延迟
- visual-studio-code - VS Code 扩展 - 订阅符号重命名
- laravel - 在 Laravel 中使用两个用户表进行消息传递
- perl - 在关机/重启期间无法发送 unix 邮件