NodeJS 使用passport-jwt时如何创建注销路由?

tcbh2hod  于 2023-03-22  发布在  Node.js
关注(0)|答案(1)|浏览(109)

我试着按照教程和代码沿着学习更多关于使用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)
    }
  });
});
ruarlubt

ruarlubt1#

错误“类型错误:user.refreshToken.id(...).remove is not a function”通常是在尝试对不存在或无效的对象调用remove()方法时引起的。
在您的代码中,问题可能是由于user.refreshToken数组为空,或者它不包含预期的refreshToken对象。您可以在调用remove()方法之前检查user.refreshToken是否不为空。
下面是代码的修改版本,其中包括错误处理和检查user.refreshToken数组:

router.get("/logout", verifyUser, async (req, res, next) => {
  const { signedCookies = {} } = req;
  const { refreshToken } = signedCookies;
  const userId = req.user._id;
  try {
    const user = await User.findById(userId);
    if (!user) {
      return res.status(404).json({ error: "User not found" });
    }
    const tokenIndex = user.refreshToken.findIndex(
      (item) => item.refreshToken === refreshToken
    );
    if (tokenIndex === -1) {
      return res.status(400).json({ error: "Invalid refresh token" });
    }
    user.refreshToken.id(user.refreshToken[tokenIndex]._id).remove();
    await user.save();
    res.clearCookie("refreshToken", COOKIE_OPTIONS);
    res.send({ success: true });
  } catch (error) {
    console.error(error);
    res.status(500).json({ error: "Internal server error" });
  }
});

在这个修改后的版本中,我们添加了错误处理,以处理找不到用户或refreshToken无效的情况。我们还在User.findById()和www.example.com()方法中使用了awaituser.save,以更优雅地处理异步操作。

相关问题