2015-11-06 61 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一部分。