Я выполняю запрос PUT из внешнего интерфейса в серверную часть, где функция серверной части обновляет мою базу данных Firestore. Функция отлично работает сама по себе (может быть вызвана через postman et c), но не из внешнего интерфейса, потому что 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, я также поставил эти строк на моем сервере. 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();
});
Я просто надеюсь, что мне не хватает чего-то очевидного.