使用Mongoose和Express删除用户

3

我是新手,对于Express和MongoDB都不熟悉。我在Node.js中创建了一个小型Web应用程序,并使用Express.js和Mongoose。我已经成功地创建了一个用户并让用户登录,但是我无法让用户删除他们的账户。

我在我的路由文件夹中有一个user.js文件,我在其中编写代码来进行注册、登录、删除等操作。这里是项目的GitHub链接: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("/");
}
2个回答

6

既然你是新手,我认为我应该引导你自己找问题:)

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

如果标记似乎不正确,很抱歉,因为我正在使用手机发布此答案。


1
非常感谢你,Saeid!我考虑了你的第一个建议来检查表单方法,并尝试将method="post"而不是method="delete",并在我的routes/user.js文件中更改了route.delete()为route.post()。然后我在表单中添加了一个带有csrf令牌的隐藏字段,它起作用了!谢谢你引导我走向正确方向。 - Nicholas Gati
不客气,@NicholasGati。我认为你也可以使用 delete 方法。 - Heartbit
如果你觉得某个答案帮助你解决了问题,最好给它投一票。 - Heartbit
我还没有足够的声望来投票回答,但当我有了,我会给你的答案点赞。谢谢Saeid! - Nicholas Gati
@NicholasGat 我希望你能尽快获得声望,但你也应该选择最佳答案来回答你的问题 :) 谢谢! - Heartbit

0

我曾经遇到过完全相同的问题。我使用了客户端的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();


          });

  });

1
谢谢Shazam。奇怪的是,“delete”方法不起作用,但当我将它们更改为“post”时,一切都正常了。我仍然不确定为什么会这样,但自从将routes/user.js文件更改为使用router.post()和在表单中使用method='post'后,用户已成功删除。我还必须在表单中添加一个csrf令牌作为隐藏字段。感谢您的回复! - Nicholas Gati
使用multer包,运行npm install --save multer以支持删除请求。 - Manish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接