使用 Mongoose、Express 删除用户

Delete a user with Mongoose, Express

我是 Express 和 MongoDB 的新手。我在 Node.js 中创建了一个小型 Web 应用程序,并使用 Express.js 和 Mongoose。我可以成功创建用户并让用户登录,但我无法让用户删除他们的帐户。

我的 routes 文件夹中有一个 user.js 文件,这是我编写注册、登录、删除等代码的地方。这是 link 上 [=31] 上的项目=](https://github.com/NicholasGati/shopping-cart-2)。删除用户帐户的按钮在 views/user/edit.hbs 中。我把按钮放在一个表格中。当我单击该按钮时,用户未被删除,并且出于某种原因我被重定向到“/”。注意:我的 routes/user.js 文件中的 '/:id' 变成 '/user/:id'。

以下是 routes/user.js 文件中删除方法的代码:

router.delete('/:id', isLoggedIn, (req, res, next) => {
  User.findOneAndRemove({_id: req.params.id}, (err) => {
    if (err) {
      req.flash("error", err);
      return res.redirect("/user/edit");
    }

    req.flash("success", "Your account has been deleted.");
    req.logout();
    return res.redirect("/shop/coffee");
  });
});

这是 views/user/edit.hbs 中的表格:

<form action="/user/{{user.id}}" method="delete">
  <div class="form-group">
    <button type="submit" class="btn btn-danger">Delete Account</button>
  </div>
</form>

此外,这里是 isLoggedIn 函数:

function isLoggedIn(req, res, next) {
  if (req.isAuthenticated()) {
    return next();
  }
  res.redirect("/");
}

既然你是新人我想我应该带领你自己找问题:)

  1. 确保表单方法。
  2. 确保调用删除用户的路由。

如果标记看起来不正确,我很抱歉,因为我正在使用我的 phone 来 post 这个答案。

我遇到了完全相同的问题。为了做到这一点,我从客户端使用了 XMLHttpRequest。抱歉,我没有足够的经验来解释为什么它以这种方式工作而不是从节点端工作,但这可能与表单数据本身设计用于传递信息而不是删除信息有关。无论如何,请尝试此解决方案。

在您的客户端代码中:

您的按钮代码(表单操作无关紧要,就此而言,标签也不应该,因为逻辑是在 JS 中处理的,但这是我使用的):

<a href="/user/{{user.id}}"><button id = "del-btn" class="btn btn-danger">Delete</button></a>

         

从按钮点击发送 HTTP 请求的脚本,此代码应与上面的按钮放在同一文件中,或者作为 HTML 页面导入的包含 JS 文件:

<script>
        var del_btn = document.getElementById("del-btn");
        del_btn.addEventListener("click", function(e) {

            var user = <%- JSON.stringify(user) %>;
            var xhr = new XMLHttpRequest();
            xhr.open("DELETE", "/user/" + user._id);
            xhr.onreadystatechange = function () {
                if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
                    console.log(xhr.responseText);
                    window.location.href = "/users";
                }
            };
            xhr.send();


            //make XMLHttpRequest to delete the poll here
        }, false);
</script>

在您的服务器端路由中,请注意响应只是一个成功代码。进行重定向的是来自客户端的 XMLHTTP 请求:

  app.delete('/user/:id', isLoggedIn, function(req,res){
          User.remove({
            _id: req.params.id,
            ownerID: req.user._id
          }, function (err, user) {
            if (err)
              return console.error(err);

            console.log('User successfully removed from polls collection!');
            res.status(200).send();


          });

  });