Javascript 当请求者设置内容类型时,为什么express POST端点返回404?
我有一台express服务器:Javascript 当请求者设置内容类型时,为什么express POST端点返回404?,javascript,node.js,express,Javascript,Node.js,Express,我有一台express服务器: import express from "express"; const app = express() const port = 3000; app.use(express.json()) app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", "*"); res.header("Ac
import express from "express";
const app = express()
const port = 3000;
app.use(express.json())
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "*");
next();
});
app.post(/city\/get-ids/g, (req, res) => {
console.log(req.body);
res.send('Hello World!')
})
app.listen(port);
以及前端提取请求:
const response = await fetch('http://localhost:3000/city/get-ids/', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify({a: 1})
});
如果我在fetch上注释掉Content-Type
,我会得到一个“Hello-World”响应,但服务器将req.body记录为空对象
如果我在获取时保留内容类型
,我会得到404
为什么设置内容类型使express返回404而不设置它返回“Hello World”出现问题时,得到了更好的响应() 问题是
app.post(/city\/get id/g
中的全局g
)
您可以在此处了解更多有关原因的信息:
不管怎样,解决方法就是只删除g
:
app.post(/city\/get-ids/, (req, res) => {
console.log(req.body);
res.send('Hello World!')
});
供后人评论的老帖子: 好吧,修正了,但还是毫无意义 以下是修复方法:
app.post("/city/get-ids*", (req, res) => {
console.log(req.body);
res.send('Hello World!')
})
由于某些原因,如果设置了内容类型,则RegExp版本无法工作。无论哪种方式,飞行前选项都会正确返回。如果没有内容类型,则POST路由将正确匹配。但是,当设置了内容类型时,POST路由的RegExp将不再工作
这完全没有意义。这听起来像是Express的一个bug,也许?我放了一个进去,得到了回应,并更新了答案。天哪,这是一个很好的答案!请注意,如果你要坚持使用正则表达式,你可能想用
^
和$
来锚定模式,如所示。否则你可能会被b抓住像这样的东西:/city\/get-ids/g.test(“/foo/city/get-ids/bar/”)==true
lol。我专门使用RegExp是为了轻松搞定和避免问题!