我收到“无法设置 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 值,这样做你不会调用所有函数,而是只调用正确的函数。