我正在尝试使用"记住我">功能设置护照本地策略。正如 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) {...})
详细:
像
Token
这样的猫鼬模型没有称为save
的方法。 您应该创建它的实例,然后该实例具有一个名为save
的方法将其保存到数据库中。你用过
token, { userId: req.user.id }
应该{token, userId: req.user.id }