【问题标题】:Forcing Sequelize to update req.user in Express route强制 Sequelize 更新 Express 路由中的 req.user
【发布时间】: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


【解决方案1】:

// 编辑:重写第一段以更清晰

当您更改 Instance 对象中的任何列值时,您还需要将更改显式保存到数据库中以持久保存它们。由于您已经通过 passport.deserializeUser 将用户实例存储在 req.user 中,因此您只需对路由代码进行少量更改即可。

我建议不要使用/change-email 的当前路线:

app.get('/change-email', function(req, res) {
  req.user.email = req.body.email;
  req.user.save()
  .then(function() {
    res.status(200).end();
  });
});

有关如何将更改持久化到实例的更多信息,请参阅 Sequelize 文档的this 部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 2021-04-24
    • 2017-09-19
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多