首页 > 解决方案 > 删除请求导致节点服务器冻结

问题描述

所以我有一个迷你快递应用程序,用户可以在其中注册、登录和删除他们的帐户。由于 html 不支持 DELETE,我使用了 npm 包 methodOverride。

这就是我的表单和 express-override 中间件的样子:

服务器.js

// Method override
app.use(
  methodOverride(function (req, res) {
    if (req.body && typeof req.body === 'object' && '_method' in req.body) {
      let method = req.body._method;
      delete req.body._method;
      return method;
    }
  })

索引.hbs

    <form action="/profile/delete/{{_id}}" method="POST" class="pt-2">
     <label for="delete-input_confirmation"></label>
     <input type="hidden" name="_method" value="DELETE">
     <button type="submit" class="btn delete-confirm">Confirm</button>
    </form>
             

现在在我的 users.js 中删除请求:

    router.delete('/profile/delete/:id', ensureAuth, async (req, res) => {
      try {
        let userId = await LocalUser.findById(req.params.id);
    
        if (!userId) {
          return res.render('/');
        } else {
          await LocalUser.findOneAndRemove({ _id: req.params.id });
          res.redirect('/register');
          console.log(userId);
        }
      } catch (err) {
        console.error(err);
        return res.render('/');
      }
    });

现在,上面的代码会发生什么,它可以正常运行,但它不会越过 DELETE 请求并呈现 /register 页面。然后节点服务器停止工作,我必须重新启动它并清除我的缓存。在我的 mongo db 中,它删除了用户,所以我不知道为什么会这样。

标签: javascriptnode.jsmongodbexpress

解决方案


我会将我的评论放入答案中,因为这最终为您解决了问题。

如果您要删除当前用户,但让他们的服务器端会话保持打开状态,那么这可能会导致会话问题。要清除该会话,您可以调用req.session.destroy()或删除会话 cookie(会话将与该浏览器分离并最终消失)。

当您有一个已删除用户的会话时,您的站点变得无法运行这一事实可能意味着您在会话逻辑或代表不存在的用户访问数据库时遇到了一些错误处理问题。发生这种情况时,您的代码应该能够显示错误并至少报告错误,但可能会强制用户返回/login.


推荐阅读