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