我正在為一個學校專案撰寫一個 wbesite 的后端,我在喜歡和不喜歡我的代碼部分時遇到了錯誤。當我嘗試洗掉 like 時,我收到“錯誤 [ERR_HTTP_HEADERS_SENT]:無法設定標頭”,但是當我在 removeLike 函式中使用 Promise 而不是 async 時,它正在作業。
async function likeSauce(req, res) {
if (![1, -1, 0].includes(req.body.like)) {
return res.status(403).send({ message: "Invalid like value" })
} else {
await addLike(req, res)
await addDislike(req, res)
await removeLike(req, res)
await removeDislike(req, res)
}
}
async function addLike(req, res) {
if (req.body.like === 1) {
try {
await Product.findOneAndUpdate({ _id: req.params.id }, { $inc: { likes: 1 }, $push: { usersLiked: req.body.userId } })
return res.status(200).send({ message: "Like added !" })
} catch (error) {
res.status(400).send({ error })
}
}
}
async function addDislike(req, res) {
if (req.body.like === -1) {
try {
await Product.findOneAndUpdate({ _id: req.params.id }, { $inc: { dislikes: 1 }, $push: { usersDisliked: req.body.userId } })
return res.status(200).send({ message: "Dislike added !" })
} catch (error) {
res.status(400).send({ error })
}
}
}
async function removeLike(req, res) {
const resultat = await Product.findOne({ _id: req.params.id })
if (resultat.usersLiked.includes(req.body.userId)) {
try {
await Product.findOneAndUpdate({ _id: req.params.id }, { $inc: { likes: -1 }, $pull: { usersLiked: req.body.userId } })
return res.status(200).send({ message: "Like removed !" })
} catch (error) {
res.status(400).send({ error })
}
}
}
async function removeDislike(req, res) {
const resultat = await Product.findOne({ _id: req.params.id })
if (resultat.usersDisliked.includes(req.body.userId)) {
try {
await Product.findOneAndUpdate({ _id: req.params.id }, { $inc: { dislikes: -1 }, $pull: { usersDisliked: req.body.userId } })
return res.status(200).send({ message: "Dislike removed !" })
} catch (error) {
res.status(400).send({ error })
}
}
}
uj5u.com熱心網友回復:
那是因為您使用 await :
await addLike(req, res)
await addDislike(req, res)
await removeLike(req, res)
await removeDislike(req, res)
這將指示 node.js 等待函式完成,但在所有這些函式中,您回傳一個res.send.
所以之后,第一個呼叫 Express 已經發送了回應,第二個函式呼叫將在嘗試res.send
您必須使用 callbak 或更好的承諾來利用 Node.js aysnchronous bay。
你應該res.send只做一次。
承諾您的 4 個功能并使用then()并catch()呼叫它們。然后res.send最后只呼叫一次then()。
此外,您應該like在呼叫函式之前測驗值,這樣做您不會呼叫所有函式,而只會呼叫正確的函式。
uj5u.com熱心網友回復:
始終回傳 res,即使在 catch 部分
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/444092.html
標籤:javascript 节点.js 异步
上一篇:節點按最后一個空格分割字串
