我在我的快递应用上实现serializeUser()
时遇到了一个奇怪的问题。我的数据模型要求使用单一类型的"用户"存在于两个模型中,基本上是Identity
(用户名,密码,角色等),然后是特定于角色的数据,例如Author
(特定于作者角色的数据)。我通过在Identity
模型中存储Author
的ref(ObjectID)来解决这个问题。因此,我的注册功能如下所示(简化):
// 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
),以便访问{{1}的ObjectID文档,而不是Identity
文档:
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
电话引起的。我使用的是lodash v.2.4.2
答案 0 :(得分:0)
原来mongoose并不想尝试_.merge
两个文档 - 只需使用document.toObject()
方法解决了这个问题:
var user = _.merge(identity.toObject(), author.toObject());
一点也不差!