一尘不染

提取请求后为空

node.js

我在用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)

这是我的客户:

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)
})

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


阅读 172

收藏
2020-07-07

共1个答案

一尘不染

问题是

mode: 'no-cors'

文档中

防止该方法成为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']
}))

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

2020-07-07