Node.js Node express req.body返回空obj

Node.js Node express req.body返回空obj,node.js,express,fetch,Node.js,Express,Fetch,这是我在客户端的获取请求 let data = JSON.stringify({ "username": "test", "password": "test" }); let response = await fetch("http://localhost:5050/api/login", { method: 'post', body: data }) 在节点服务器中,这是

这是我在客户端的获取请求

let data = JSON.stringify({
  "username": "test",
  "password": "test"
 });

 let response = await fetch("http://localhost:5050/api/login", {
  method: 'post',
  body: data
})
在节点服务器中,这是我登录时使用的

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: false}))
app.use(express.json());
app.use(cors())


router.post('/login', function(req, res) {
  console.log(req.body) // Returns {}
  res.json(JSON.stringify({success: "qwer123qwer324135142534123qwerqwersfg"}));
})
而print
req.body
返回
{}
。有人知道怎么解决吗

更新

我用邮递员做了同样的尝试。它在节点服务器中打印正确的对象。但在使用fetch-only时,它失败了

Package.json

"dependencies": {
   "body-parser": "^1.19.0",
   "cors": "^2.8.5",
   "express": "^4.17.1",
   "mongoose": "~3.6.13"
 }

您需要使用中间件来解析正文:

在应用程序中添加:

app.use(express.json());

您需要使用中间件来解析正文:

在应用程序中添加:

app.use(express.json());

在app.js中试试看

const bodyParser = require('body-parser');


app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: false}))


在app.js中试试这个

const bodyParser = require('body-parser');


app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: false}))


默认情况下,Fetch API为text/plain请求设置
Content-Type
,在这种情况下,由于服务器API接受JSON数据,我们需要显式设置Content-Type头。将fetch的代码更改为以下应该可以使其正常工作:

 let response = await fetch("http://localhost:5050/api/login", {
  method: 'POST',
  body: data,
  headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    }
})
注意:(这不影响请求处理程序中接收的数据,但作为一般做法)

同样在服务器代码中,json解析也不需要同时包含body parser/express中间件。您可以使用:

app.use(bodyParser.json())
app.use(bodyParser.urlencoded(<options>))

app.use(bodyParser.json())
app.use(bodyParser.urlencoded())

app.use(express.json());
app.use(express.urlencoded());

不需要同时包括这两个方面。您可以在下面的stackoverflow帖子中了解更多信息:

默认情况下,Fetch API为text/plain请求设置
内容类型
,在这种情况下,由于服务器API接受JSON数据,我们需要显式设置内容类型头。将fetch的代码更改为以下应该可以使其正常工作:

 let response = await fetch("http://localhost:5050/api/login", {
  method: 'POST',
  body: data,
  headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    }
})
注意:(这不影响请求处理程序中接收的数据,但作为一般做法)

同样在服务器代码中,json解析也不需要同时包含body parser/express中间件。您可以使用:

app.use(bodyParser.json())
app.use(bodyParser.urlencoded(<options>))

app.use(bodyParser.json())
app.use(bodyParser.urlencoded())

app.use(express.json());
app.use(express.urlencoded());

不需要同时包括这两个方面。您可以在下面的stackoverflow帖子中了解更多信息:

您是否正在使用中间件(
app.use()
)如body parse来解析body?您是否可以共享app.js文件中可能包含的body parser中间件的代码?如果它通过邮递员而不是fetch工作,那么我们可能需要更新中间件中设置的选项。如果不查看中间件代码,就无法提供帮助。@Raeesaa更新了代码。您是否正在使用中间件(
app.use()
)如body parse来解析正文?您是否可以共享您可能已包含在app.js文件中的正文解析器中间件代码?如果它通过邮递员而不是fetch工作,那么我们可能需要更新中间件中设置的选项。如果不查看中间件代码,就无法提供帮助。@Raeesaa更新了代码