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



我正在尝试使用"记住我">功能设置护照本地策略。正如 PassportJS 文档所推荐的那样,这个想法是检测是否选中了记住我选项,如果是,则生成一个唯一的令牌并将其存储到数据库中的 **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()上抛出以下错误:

类型错误:_token.default.save 不是一个函数

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

import mongoose from 'mongoose';
const { Schema } = mongoose;
const tokenSchema = new Schema({
token: String,
userId: String,
});
const Token = mongoose.model('token', tokenSchema);
module.exports = Token;

你有猫鼬语法错误。 替换:

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 }

最新更新