【问题标题】:Redirect user to the home page after deleting an account - express, mongo, axios删除账号后重定向用户到首页 - express, mongo, axios
【发布时间】:2021-05-21 08:36:00
【问题描述】:

如果我想先删除用户而不是与该用户关联的会话,我想知道下面的代码是否正确?另外,我试图在删除后将用户重定向到主页,但是如果我添加 res.redirect("/") 它说我无法设置标题:

(node:2852) UnhandledPromiseRejectionWarning: 错误 [ERR_HTTP_HEADERS_SENT]: 发送到客户端后无法设置标头

router.delete("/", isLoggedIn, (req, res, next) => {
  console.log("DELETETETING USER", req.user.id);
  User.findByIdAndDelete(req.user.id)
    .then(() => {
      Session.findByIdAndDelete(req.headers.authorization)
        .then(() => {
          res.status(200).json({ message: "User and session was deleted" });
        })
        .catch((err) => {
          console.log(err);
          res.status(500).json({ errorMessage: err.message });
        });
    })
    .catch((err) => {
      console.log(err);
      res.status(500).json({ errorMessage: err.message });
    });
});

在站点标题中,我正在显示用户数据,但在我删除帐户后,用户名仍然可见。我将用户作为道具从主应用状态传递到站点标题。

谢谢

【问题讨论】:

    标签: reactjs mongodb express axios mern


    【解决方案1】:

    一个 HTTP 请求只能有一个响应。对请求做出一次响应后,您将无法发送第二个响应。

    要重定向用户,您需要向 HTTP 请求发送 30 倍的响应。但是在您的代码中,您已经通过这一行发送了 200(成功响应):

    res.status(200).json({ message: "User and session was deleted" });
    

    这就是您收到此错误的原因:

    (node:2852) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    

    要解决这个问题,您需要将“成功”响应替换为重定向,如下所示:

    router.delete("/", isLoggedIn, (req, res, next) => {
      console.log("DELETETETING USER", req.user.id);
      User.findByIdAndDelete(req.user.id)
        .then(() => {
          Session.findByIdAndDelete(req.headers.authorization)
            .then(() => {
              res.redirect("/");
            })
            .catch((err) => {
              console.log(err);
              res.status(500).json({ errorMessage: err.message });
            });
        })
        .catch((err) => {
          console.log(err);
          res.status(500).json({ errorMessage: err.message });
        });
    });
    

    或者,您可以保持后端代码不变,并通过一些Javascript逻辑在前端实现重定向。


    在你的情况下,我会用res.redirect("/"); 替换res.status(200).json({ message: "User and session was deleted" });,因为“成功”响应似乎是多余的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 2018-08-15
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      相关资源
      最近更新 更多