繁体   English   中英

执行 put 请求时,Req.body 为空 object

[英]Req.body is empty object when performing a put request

我正在执行从前端到后端的 PUT 请求,后端 function 更新我的 Firestore 数据库。 function 本身可以正常工作(可以通过 postman 等调用),但不能从前端调用,因为 req.body 将始终是一个空的 object。 我当然检查了许多其他类似的案例,添加了一堆标题和其他东西,但没有一个能解决我的问题。 这是我的后端代码:

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)
    }
})

我的前端 function 有两种不同的方法,具体取决于结果参数,它们现在看起来略有不同,只是为了说明我如何编写请求似乎并不重要。 function 目前不返回任何内容,因为它只需要更新数据库。

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
        })
    })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM