我在用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为空。有人能帮我吗?谢谢 !
问题是
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测试时)。
Content-Type: application/json
content-type: text/plain
由于您的Express服务器需要JSON,因此它不会解析此请求。
我建议省略mode配置。"cors"而是使用默认选项。
mode
"cors"
由于您的请求并不 简单 ,因此您可能需要向Express服务器中添加一些CORS中间件。
另一个(略有漏洞)选项是告诉Express将text/plain请求解析为JSON。这使您可以将JSON字符串作为简单请求发送,这也可以避免预检OPTIONS请求,从而降低总体网络流量。
OPTIONS
app.use(express.json({ type: ['application/json', 'text/plain'] }))
编辑:将结尾括号添加到app.use最终代码块。
app.use