提取请求后的空主体

Tri*_*tch 7 javascript http fetch node.js express

我在javascript中尝试获取API。当我尝试通过获取将某些内容发布到服务器时,请求正文为空数组。但是,当我使用Postman时,它可以工作...这是我在NodeJS中的服务器代码:

const express = require('express')
const app = express()
const port = 3000

app.use(express.json())
app.post('/api', function (req, res) {
    console.log(req.body)
})
app.listen(port)
Run Code Online (Sandbox Code Playgroud)

这是我的客户:

fetch('http://"theserverip":3000/api', {
    method: 'POST',
    headers: { "Content-Type": "application/json" },
    mode: 'no-cors',
    body: JSON.stringify({
        name: 'dean',
        login: 'dean',
    })
})
.then((res) => {
    console.log(res)
})
Run Code Online (Sandbox Code Playgroud)

问题是在服务器端,req.body为空。有人能帮我吗?谢谢 !

Phi*_*hil 14

问题是

mode: 'no-cors'
Run Code Online (Sandbox Code Playgroud)

文档中 ...

防止该方法成为HEAD,GET或POST之外的任何其他内容,并且阻止标头成为简单标头之外的任何其他内容

简单内容类型报头限制允许

  • text/plain
  • application/x-www-form-urlencoded
  • multipart/form-data

这会导致您精心制作的Content-Type: application/json标头成为content-type: text/plain(至少在通过Chrome测试时)。

由于您的Express服务器需要JSON,因此它不会解析此请求。

我建议省略mode配置。"cors"而是使用默认选项。


由于您的请求并不简单,因此您可能需要向Express服务器中添加一些CORS中间件

另一个(略有漏洞)选项是告诉Express将text/plain请求解析为JSON。这使您可以将JSON字符串作为简单请求发送,这也可以避免进行预检OPTIONS请求,从而降低总体网络流量...

app.use(express.json({
  type: ['application/json', 'text/plain']
}))
Run Code Online (Sandbox Code Playgroud)

编辑:将结尾括号添加到app.use最终代码块。

  • 最后!我只是添加了 cors lib“yarn add cors”,并在文件 app.js 中添加了:app.use(cors())。多谢! (2认同)