【发布时间】:2016-02-07 04:48:15
【问题描述】:
我有一个非常简单的网站,它使用 Passport JS 创建本地登录策略,以使用 Sequelize ORM 访问本地 postgres 数据库。
用户模型如下所示:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('user', {
id: {
primaryKey: true,
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4
},
email: DataTypes.STRING,
password: DataTypes.STRING,
}, {
classMethods: {
generateHash: function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
},
},
instanceMethods: {
validPassword: function(password) {
return bcrypt.compareSync(password, this.password);
}
},
getterMethods: {
someValue: function() {
return this.someValue;
}
},
setterMethods: {
someValue: function(value) {
this.someValue = value;
}
}
});
}
一切似乎都很好。我可以使用此策略进行注册、登录并查看数据。
我也在使用 Express 并设置了各种路线。 req.user 似乎设置正确,因为我可以与该对象的所有字段进行交互。
考虑正确工作的示例路线:
app.get('/profile', isLoggedIn, function(req, res) {
res.render('profile.ejs', {
user : req.user
});
});
我的序列化/反序列化方法:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id).then(function(user) {
done(null, user);
}).catch(function(e) {
done(e, false);
});
});
因此,根据 Passport JS 文档,用户会话似乎已正确设置并连接到 Express。
问题是我无法更新用户对象中的任何字段。
如果我有以下路线:
app.get('/change-email', function(req, res) {
req.user.email = req.body.email;
res.status(200).end();
});
数据库中什么也没有发生。
这与this question 非常相似,只是它与 Sequalize 一起出现,用户对象永远不会持续存在,即使在注销并重新登录后也是如此。
我也试过了:req.session.passport.user.email = req.body.email
虽然我认为这不能解决问题,但我也尝试使用新的用户对象调用login,但这会产生 500 错误。根据 Passport JS 文档,可以调用的函数数量有限,我开始怀疑这个功能是否可行。
我不确定从这里尝试什么。如何使用 Sequelize 更新我的 user 对象?
任何帮助将不胜感激!谢谢!
【问题讨论】:
-
您的数据库中是否已有用户?您可能需要在
serializeUser函数中填充它们。当护照可以验证新用户以添加到会话时,将调用此方法。 -
我已经尝试了两种方法:让用户在我的表中,然后删除表让 Sequalize 自己重新创建它;两种情况下的结果相同。
标签: node.js express passport.js sequelize.js passport-local