【发布时间】:2017-03-03 05:24:33
【问题描述】:
在我的 express 应用上实现 serializeUser() 时遇到一个奇怪的问题。我的数据模型要求在两个模型中存在单一类型的“用户”,基本上是 Identity(用户名、密码、角色等),然后是特定于角色的数据,例如 Author(特定于作者角色)。我通过将Identity 的引用(ObjectID)存储在我的Author 模型中来解决这个问题。因此,我的注册功能如下所示(简化):
// Mongoose will just take what it needs for each model
var identity = new Identity(req.body);
var author = new Author(req.body);
identity.save(function(err) {
if (!err) {
// Save reference to identity
author._identity = identity._id;
// Save author document, then login
author.save(function (err) {
// create new "user" object from both identity and author objects
var user = _.merge(identity, author);
req.login(user, function(err) { res.json(user); });
});
}
});
这工作正常,一切都很好地存储在 mongo 中。但是,对于serializeUser(),我想存储user._identity,而不是user._id(或user.id,因为它的用法很奇怪),以便访问Identity 文档的ObjectID,而不是Author 文档:
passport.serializeUser(function(user, done) {
console.log('user', user); // returns full, concatenated object
console.log('_id', user._id); // returns ObjectID value
console.log('_iden', user._identity); // returns undefined
// breaks with a "Failed to serialize user into session" error
done(null, user._identity);
});
奇怪的是console.log(user) 给出了完整的(连接对象),而user._id 返回了一个值,但user._identity 返回了undefined(并且没有为此返回其他值。任何洞察原因这可能正在发生还是我应该采取不同的方法?
注意:这似乎是由_.merge 调用引起的。我正在使用 lodash v.2.4.2
【问题讨论】:
-
能否请您发布您的
user schema,以及您如何deserializing用户。 -
尝试在
_.merge(identity, author);之后输出console.log(user),看看indentity是否被初始化 -
@John
identity已初始化 - 奇怪的是只有 user.id 具有分配值,而不是来自identity对象或author对象的属性... -
我更喜欢自己构建一个json。也许合并不够好
标签: node.js express mongoose passport.js lodash