【问题标题】:Delete a user with Mongoose, Express使用 Mongoose、Express 删除用户
【发布时间】:2017-05-16 01:12:21
【问题描述】:

我是 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("/");
}

【问题讨论】:

    标签: node.js mongodb express mongoose crud


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢赛义德!我想到了您检查表单方法的第一点,并尝试了 method="post" 而不是 method="delete" 并在我的 routes/user.js 文件中将 route.delete() 更改为 route.post() 。然后我在表单中添加了一个带有 csrf 令牌的隐藏字段,它起作用了!感谢您引导我朝着正确的方向前进。
    • 欢迎您@NicholasGati。我想你也可以使用delete 方法。
    • 如果您觉得某个答案可以帮助您解决问题,最好投票。
    • 我还没有投票答案的声誉,但是当我这样做时,我会为你的答案投票。谢谢赛义德!
    • @NicholasGat 我希望您能尽快获得声誉,但您也应该为您的问题选择最佳答案 :) 谢谢!
    【解决方案2】:

    我遇到了同样的问题。为了做到这一点,我使用了客户端的 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();
    
    
              });
    
      });
    

    【讨论】:

    • 感谢 Shazam。奇怪的是,“删除”方法不起作用,但是当我将它们更改为“发布”时,一切正常。我仍然不确定为什么会这样,但是由于将 routes/user.js 文件更改为在表单中使用 router.post() 和 method='post' ,用户被成功删除。我还必须在表单中添加一个 csrf 令牌作为隐藏字段。感谢您的回复!
    • 使用包multernpm install --save multer支持删除请求。
    猜你喜欢
    • 2015-03-07
    • 2017-08-04
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2018-09-19
    • 2023-03-25
    • 2014-05-01
    • 2021-12-28
    相关资源
    最近更新 更多