Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当请求者设置内容类型时,为什么express POST端点返回404?_Javascript_Node.js_Express - Fatal编程技术网

Javascript 当请求者设置内容类型时,为什么express POST端点返回404?

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

我有一台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("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是为了轻松搞定和避免问题!