2015-11-06 22 views
0

更新req.user我有一个使用护照JS创建本地登录策略击中使用Sequelize ORM本地Postgres数据库一个非常简单的网站。强制Sequelize在快递航线

用户模型看起来是这样的:

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; 
      } 
     } 
    }); 
} 

似乎一切都工作得很好。我可以使用此策略注册,登录并查看数据。

我也是用快递,并有多种途径设置。 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); 
    }); 
}); 

所以,按照护照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对象?

任何帮助将不胜感激!谢谢!

+0

你已经在你的数据库的用户?你可能需要在'serializeUser'函数中填充它们。当护照可以验证新用户以添加到会话时,这会被调用。 –

+0

我试过两种方法:让用户在我的表中,然后放下表让Sequalize自己重新创建它;两种情况下的结果都是相同 –

回答

0

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

当您更改一个实例中的任何列的值对象,你还需要明确地将更改保存到数据库中去坚持他们。由于您已通过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一部分。