Passport.js - serializeUser在lodash _.merge之后找不到用户属性

时间:2016-10-21 02:38:45

标签: node.js express mongoose passport.js lodash

我在我的快递应用上实现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

1 个答案:

答案 0 :(得分:0)

原来mongoose并不想尝试_.merge两个文档 - 只需使用document.toObject()方法解决了这个问题:

var user = _.merge(identity.toObject(), author.toObject());

一点也不差!