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编码。我不知道这是从哪里来的。这里提到了限制(好吧,它链接到一个关于“简单标题”的页面,在那里它被实际解释了)。