我试着按照教程和代码沿着学习更多关于使用passport-jwt和mern stack进行身份验证的知识。https://www.codingdeft.com/posts/react-authentication-mern-node-passport-express-mongo/。当我使用用户名和密码登录时,它会给我一个令牌。使用该令牌,当我尝试使用以下逻辑注销时。我得到错误:TypeError: user.refreshToken.id(...).remove is not a function
.
我不知道如何解决这个问题。
router.get("/logout", verifyUser, async (req, res, next) => {
const { signedCookies = {} } = req;
const { refreshToken } = signedCookies;
User.findById(req.user._id).then((user) => {
const tokenIndex = user.refreshToken.findIndex(
(item) => item.refreshToken === refreshToken
);
if (tokenIndex !== -1) {
user.refreshToken.id(user.refreshToken[tokenIndex]._id).remove()
}
try {
user.save();
res.clearCookie("refreshToken", COOKIE_OPTIONS);
res.send({ success: true, user: user.refreshToken._id })
} catch (error) {
res.statusCode = 500
res.send(error)
}
});
});
1条答案
按热度按时间ruarlubt1#
错误“类型错误:user.refreshToken.id(...).remove is not a function”通常是在尝试对不存在或无效的对象调用remove()方法时引起的。
在您的代码中,问题可能是由于user.refreshToken数组为空,或者它不包含预期的refreshToken对象。您可以在调用remove()方法之前检查user.refreshToken是否不为空。
下面是代码的修改版本,其中包括错误处理和检查user.refreshToken数组:
在这个修改后的版本中,我们添加了错误处理,以处理找不到用户或refreshToken无效的情况。我们还在User.findById()和www.example.com()方法中使用了awaituser.save,以更优雅地处理异步操作。