我收到“无法设置 headers 后它们被发送到客户端”的错误 node-js
I get the " Cannot set headers after they are sent to the client " error with node-js
我正在为一个学校项目编写 wbesite 的后端代码,我在代码的喜欢和不喜欢部分遇到了错误。当我尝试删除 like 但是当我在我的 removeLike 函数中使用 promises 而不是 async 时,我得到了“错误 [ERR_HTTP_HEADERS_SENT]:在将它们发送到客户端后无法设置 headers”。
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 })
}
}
}
总是做return res,即使在捕捉部分
那是因为你使用 await for:
await addLike(req, res)
await addDislike(req, res)
await removeLike(req, res)
await removeDislike(req, res)
这将指示 node.js 等待函数完成,但在所有这些函数中,您 return 带有 res.send
。
所以之后,第一次调用 Express 已经发送了响应,第二次函数调用将在尝试 res.send
时生成你的错误
你必须利用 Node.js aysnchronous bay using callbak or better promise。
你应该res.send
一次。
promisify 你的 4 个函数并使用 then()
和 catch()
来调用它们。然后在最后 then()
.
只调用一次 res.send
此外,你应该在调用函数之前测试 like
值,这样做你不会调用所有函数,而是只调用正确的函数。
我正在为一个学校项目编写 wbesite 的后端代码,我在代码的喜欢和不喜欢部分遇到了错误。当我尝试删除 like 但是当我在我的 removeLike 函数中使用 promises 而不是 async 时,我得到了“错误 [ERR_HTTP_HEADERS_SENT]:在将它们发送到客户端后无法设置 headers”。
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 })
}
}
}
总是做return res,即使在捕捉部分
那是因为你使用 await for:
await addLike(req, res)
await addDislike(req, res)
await removeLike(req, res)
await removeDislike(req, res)
这将指示 node.js 等待函数完成,但在所有这些函数中,您 return 带有 res.send
。
所以之后,第一次调用 Express 已经发送了响应,第二次函数调用将在尝试 res.send
你必须利用 Node.js aysnchronous bay using callbak or better promise。
你应该res.send
一次。
promisify 你的 4 个函数并使用 then()
和 catch()
来调用它们。然后在最后 then()
.
res.send
此外,你应该在调用函数之前测试 like
值,这样做你不会调用所有函数,而是只调用正确的函数。