Node.js ExpressJs请求正文为空
我在Node.js ExpressJs请求正文为空,node.js,express,cors,fetch,Node.js,Express,Cors,Fetch,我在localhost:5000有一个express应用程序,在localhost:3000有一个react应用程序 我是通过 fetch(`${backendUrl}/charge`, { method: "POST", mode: "no-cors", headers: { "Content-Type": "application/j
localhost:5000有一个express应用程序,在localhost:3000有一个react应用程序
我是通过
fetch(`${backendUrl}/charge`, {
method: "POST",
mode: "no-cors",
headers: {
"Content-Type": "application/json"
},
body: {
stripeToken: token,
chargeAmount: this.state.donationAmount
}
})
并以
function route(req, res) {
console.log(req.body);
}
服务器应该正确配置为与CORS一起工作,但主体仍然是空的
//configure env variables
require("dotenv").config();
//import packages
var express = require("express");
var bodyParser = require("body-parser");
var cors = require("cors");
//import route functions
const StripeRoute = require("./StripeRoute");
//setup app
const app = express();
const port = process.env.PORT || 5000;
//setup bodyparser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
//Setup CORS
app.use(cors());
app.options("*", cors()); // include before other routes
//Connect functions to API routes
app.post("/charge", StripeRoute);
module.exports = app;
根据,body
选项应该是少数特定类型之一,Object
不是其中之一
尝试使用JSON字符串:
body: JSON.stringify({
stripeToken: token,
chargeAmount: this.state.donationAmount
})
编辑:由于您使用的是无COR
,因此无法设置内容类型应用程序/json
。相反,您需要生成一个URL编码的字符串,并将内容类型设置为应用程序/x-www-form-urlencoded
(因为没有COR
将仅使用“简单标题”工作,如前所述和进一步所述)。根据,主体
选项应该是少数特定类型之一,对象
不是其中之一
尝试使用JSON字符串:
body: JSON.stringify({
stripeToken: token,
chargeAmount: this.state.donationAmount
})
编辑:由于您使用的是无COR
,因此无法设置内容类型应用程序/json
。相反,您需要生成一个URL编码的字符串,并将内容类型设置为应用程序/x-www-form-urlencoded
(因为没有COR
将只使用“简单头”工作,如前所述和进一步所述)。express route在其参数中需要包含对正在使用的主体解析器的实例/obj的引用。好主意。我尝试了constjsonparser=bodyParser.json();app.post(“/charge”,jsonParser,StripeRoute)代码>但它没有帮助。我相信app.use
语句可以自动使解析器普遍工作,因此不需要将其传递给每个应用程序route@JamesL. 这是正确的(app.use(bodyParser.json())
将为每个请求启用json正文解析)太好了!谢谢你的确认。这是文档--我很惊讶应用程序没有路径
参数。使用
。不知何故,它只是知道何时使用json
或urlencoded
快速路由的args中需要包含对正在使用的主体解析器的instance/obj的引用。好主意。我尝试了constjsonparser=bodyParser.json();app.post(“/charge”,jsonParser,StripeRoute)代码>但它没有帮助。我相信app.use
语句可以自动使解析器普遍工作,因此不需要将其传递给每个应用程序route@JamesL. 这是正确的(app.use(bodyParser.json())
将为每个请求启用json正文解析)太好了!谢谢你的确认。这是文档--我很惊讶应用程序没有路径
参数。使用
。不知怎的,它只是想知道何时使用json
或urlencoded
您是否使用浏览器的开发工具检查了请求中发送的内容?我觉得后者还行(您获得[object]的原因)
是因为对象
不是主体
的有效选项值,它只是被字符串化了)。尝试使用DEBUG=*node server.js
(或其他任何名称)运行服务器,也许这可以解释为什么正文没有被正确解析。使用您的代码和类似的Express设置,我无法重现您的问题。是的,看起来JSON解析器正在传递请求。回到浏览器的开发工具:正在发送的请求头是什么?content type
正确吗?哦,等等,你正在浏览器中运行这个!这意味着使用no cors
,您不能将内容类型设置为application/json
。您需要使用application/x-www-form-urlencoded
,并对正文
选项值进行URL编码。我不知道这是从哪里来的。提到了限制(好吧,它链接到一个关于“简单标题”的页面,并在那里进行了实际解释)。您是否使用浏览器的开发工具检查了请求中发送的内容?我认为后者还可以(这就是您获得[object]的原因)
是因为对象
不是主体
的有效选项值,它只是被字符串化了)。尝试使用DEBUG=*node server.js
(或其他任何名称)运行服务器,也许这可以解释为什么正文没有被正确解析。使用您的代码和类似的Express设置,我无法重现您的问题。是的,看起来JSON解析器正在传递请求。回到浏览器的开发工具:正在发送的请求头是什么?content type
正确吗?哦,等等,你正在浏览器中运行这个!这意味着使用no cors
,您不能将内容类型设置为application/json
。您需要使用application/x-www-form-urlencoded
,并对正文
选项值进行URL编码。我不知道这是从哪里来的。这里提到了限制(好吧,它链接到一个关于“简单标题”的页面,在那里它被实际解释了)。