javascript - 执行 put 请求时,Req.body 为空对象
问题描述
我正在执行从前端到后端的 PUT 请求,后端函数更新我的 Firestore 数据库。该函数本身可以正常工作(可以通过邮递员等调用),但不能从前端调用,因为 req.body 将始终是一个空对象。我当然检查了许多其他类似的案例,添加了一堆标题和其他东西,但没有一个能解决我的问题。这是我的后端代码:
router.put('/:id/results', async (req, res) => {
try {
console.log("Updating results...") //THIS IS LOGGED
console.log(req.body) // THIS LOGS {}
let hamsters = []
console.log(req.params.id) //LOGS ID
let snapShots = await db.collection('hamsters').where("id", "==", parseInt(req.params.id)).get()
snapShots.forEach(doc => {
hamsters.push(doc.data())
})
if (req.body.wins == 1) {
hamsters[0].wins++
res.send(`${hamsters[0].name} now has ${hamsters[0].wins} wins!`)
} else if (req.body.defeats == 1) {
hamsters[0].defeats++
res.send(`${hamsters[0].name} now has ${hamsters[0].defeats} defeats!`)
} else {
throw ("You must either increase wins or defeats by 1") //THIS IS LOGGED
}
hamsters[0].games++
db.collection('hamsters').doc(req.params.id).set(hamsters[0])
}
catch (err) {
console.error(err)
}
})
我的前端函数有两种不同的方法,具体取决于结果参数,它们现在看起来略有不同,只是为了说明我如何编写请求似乎并不重要。该函数目前不返回任何内容,因为它只需要更新数据库。
export async function putBattleStats(hamsterID, outcome) {
try {
if (outcome === "win") {
const response = await fetch(`/hamsters/${hamsterID}/results`,
{
method: 'PUT', headers: { "Content-Type": "application/json/x-www-form-urlencoded" }, body: {
"hamsterID": JSON.stringify(hamsterID),
"wins": +1
}
})
} else if (outcome === "defeat") {
const response = await fetch(`/hamsters/${hamsterID}/results`,
{
method: 'PUT', body: {
"hamsterID": hamsterID,
"defeats": +1
}
})
}
}
catch (e) {
console.error('Fetch failed because', e)
return null
}
}
就像我说的,我已经尝试了各种标头,我已经安装了 node-fetch,我还将这些行放在了我的 server.js 文件中:
const bodyParser = require('body-parser')
server.use(bodyParser.urlencoded({ extended: true }));
server.use(bodyParser.json())
server.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
我只是希望我遗漏了一些明显的东西。
解决方案
这可能是因为你没有将整个身体串起来。
试试这个:
const response = await fetch(`/hamsters/${hamsterID}/results`,
// change this URL
{
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
// this can just be 'application/json' in your case
body: JSON.stringify({
hamsterID: hamsterID,
wins: 1
})
})
推荐阅读
- neo4j - neo4j cypher如何在单词节点链中找到最频繁的节点模式
- c++ - C++中的自定义排序字符串
- typescript - 为什么 Typescript 元组类型推断会这样工作?
- asp.net - site.master 中的用户代码未处理空引用异常
- sql - SQL 请求中缺少按值范围分组的计数为 0 的行
- docker - 在没有互联网连接的情况下运行 docker compose 文件
- unity3d - unity SpriteMask 交集
- python - Python 类型提示,输出类型取决于输入类型
- hive - 如何在 AWS Athena 中按列名而不是按列顺序从多个 CSV 创建表
- javascript - 这个函数声明是什么意思?函数名和参数相同