删除请求导致节点服务器冻结



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

这就是我的表单和快捷覆盖中间件的样子:

server.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数据库中,它删除了用户,所以我不知道为什么会发生这种情况。

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

如果您正在删除当前用户,但保持其服务器端会话处于打开状态,那么这可能会导致会话问题。要清除该会话,您可以调用req.session.destroy(),也可以删除会话cookie(会话将从该浏览器分离,并最终老化(。

当你有一个被删除用户的会话时,你的网站变得不起作用,这可能意味着你在会话逻辑或代表不存在的用户访问数据库时遇到了一些错误处理问题。发生这种情况时,您的代码应该能够字段错误,并至少报告错误,但可能会强制用户返回/login

最新更新