当我使用 mongoose 删除功能时,它们被发送到客户端后无法设置 headers

cannot set headers after they are sent to the client when i use mongoose remove function

当我使用此代码时

activecode.remove(err => {
                        return res.status(500).json("error message ")
                    });

发送给客户端后得到错误无法设置headers

当我删除上面的代码时,它可以正常工作

这是我的代码

 async activeUser(req, res, next) {

        try {
            const code = req.params.code;
            const activecode = await ActiveCode.findOne({
                code
            }).gt("expire", new Date()).populate("user").limit(1).exec();

            if (activecode) {

                if (activecode.used) {
                    return res.status(400).json({
                        message: "از این لینک قبلا استفاده شده است"
                    })
                } else {
                    activecode.used = true;
                    activecode.save(err => {
                        if (err) {
                            return res.status(500).json({
                                message: "خطایی در فعال سازی رخ داد"
                            })
                        };
                    });
                    if (activecode.user) {
                        activecode.user.isActive = true;
                        activecode.user.save(err => {
                            if (err) {
                                return res.status(500).json({
                                    message: "خطایی در فعال سازی رخ داد"
                                })
                            };
                        });
                        const user = {
                            id: activecode.user.id,
                            name: activecode.user.name,
                            email: activecode.user.email,
                            isActive: activecode.user.isActive
                        }
                        activecode.remove(err => {
                            return res.status(500).json("خطایی در فعال سازی اکانت رخ داد ")
                        });
                        return res.status(200).json({
                            user
                        });
                    }
                }
            } else {

                return res.status(400).json({
                    message: "چنین لینکی برای فعال سازی حساب وجود ندارد"
                });
            }
        } catch (err) {
            return res.status(500).json({
                message: "خطایی در فعال سازی حساب رخ داده لطفا دوباره امتحان کنید"
            });
        }
    }

任意 res.status.json 与 return 一起使用 我为解决这个问题所做的工作。我的代码试图发送多个响应

更改这部分代码:

activecode.remove(err => {
    return res.status(500).json("خطایی در فعال سازی اکانت رخ داد ")
});
return res.status(200).json({
    user
});

activecode.remove((err, data) => {
    if (err) {
         return res.status(500).json("خطایی در فعال سازی اکانت رخ داد ");
    } else {
         return res.status(200).json({user});
    }
});

此处的问题您的请求尝试发送两次响应,这是不允许的。

希望这对您有所帮助:)

出现这种情况是因为您试图两次发送对特定请求的响应,这是不允许的。

另请注意,当他们遇到响应(res.status()。json() 或 res.send())时,您的请求路由不会完成,它将继续解析到函数的末尾,如果在解析时遇到另一个 res.send() 或 res.status()。json() 他们将抛出上述错误。

例如

app.get('/some_route',(req,res)=>{
  if("condition")
    res.send('something);
  else
    res.send('another thing');
})


app.get('/some_route',(req,res)=>{
  if("condition")
    res.send('something');
  res.send("another something");
})

第一个例子正确,但第二个例子不正确

因为你已经有了一个带有 try/catch 的异步函数,所以你不需要使用 .save().remove() 回调。您只需要使用 await 并让 catch 为您处理错误。

这可能有帮助:

async activeUser(req, res, next) {

    try {
        const code = req.params.code;
        const activecode = await ActiveCode.findOne({
            code
        }).gt("expire", new Date()).populate("user").limit(1).exec();

        if (activecode) {

            if (activecode.used) {
                return res.status(400).json({
                    message: "از این لینک قبلا استفاده شده است"
                })
            } else {
                activecode.used = true;
                await activecode.save();
                if (activecode.user) {
                    activecode.user.isActive = true;
                    await activecode.user.save();
                    const user = {
                        id: activecode.user.id,
                        name: activecode.user.name,
                        email: activecode.user.email,
                        isActive: activecode.user.isActive
                    }
                    await activecode.remove();
                    return res.status(200).json({
                        user
                    });
                }
            }
        } else {

            return res.status(400).json({
                message: "چنین لینکی برای فعال سازی حساب وجود ندارد"
            });
        }
    } catch (err) {
        return res.status(500).json({
            message: "خطایی در فعال سازی حساب رخ داده لطفا دوباره امتحان کنید"
        });
    }
}