当要求将 'remember_me' 令牌保存到数据库时,PassportJS 抛出错误

PassportJS throwing an error when asked to save a 'remember_me' token to db

我正在尝试使用 记住我 功能设置 Passport Local 策略。按照 PassportJS 文档的建议,这个想法是检测 Remember me 选项是否被选中,如果是,则生成一个唯一的令牌并将其存储到数据库中的 *​​tokens* 集合中.

我的路线目前是这样设置的:

router.post('/',
    passport.authenticate('local', { failureRedirect: '/' }),
    async (req, res, next) => {
      const {body: {remember_me, username}} = req;
      // issue a remember me cookie if the option was checked
      if (!remember_me) { return next(); }

      const token = uuidv4();
      Token.save(token, { userId: req.user.id }, function(err) {
        console.log('ERROR', err);
        if (err) { return done(err); }
        res.cookie(process.env.USER_REMEMBER_COOKIE, token, { path: '/', httpOnly: true, maxAge: 604800000 }); // 7 days
        return next();
      });
    },
    (req, res) => {
      res.cookie(process.env.USER_DATA_COOKIE, signedUserData(req), {
        httpOnly: true,
        secure: true,
      });
      res.json({ success: true });
    });

但是,当我在选中复选框的情况下输入用户名和密码时,Passport 没有向数据库添加令牌并返回 cookie,而是在 Token.save() 上抛出以下错误:

TypeError: _token.default.save is not a function

我哪里错了?集合存在,模型也存在。后者看起来像这样:

import mongoose from 'mongoose';

const { Schema } = mongoose;

const tokenSchema = new Schema({
  token: String,
  userId: String,
});

const Token = mongoose.model('token', tokenSchema);

module.exports = Token;

您有 mongoose 语法错误。替换:

Token.save(token, { userId: req.user.id }, function(err) {...}

与:

(new Token({token, userId: req.user.id})).save(function(err) {...})

详细:

  1. Token这样的猫鼬模型没有名为save的方法。您应该创建它的一个实例,然后该实例有一个名为 save 的方法将其保存到数据库中。

  2. 你用了 token, { userId: req.user.id } 应该是 {token, userId: req.user.id }