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"}));
})
而printreq.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更新了代码