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

Passport.js - serializeUser doesn't find user properties after lodash _.merge

我在 express 应用程序上实现 serializeUser() 时遇到了一个奇怪的问题。我的数据模型要求单一类型的 "user" 存在于两个模型中,基本上是 Identity(用户名、密码、角色等),然后是特定于角色的数据,例如 Author(特定于作者角色的数据)。我通过将 Identity 的 ref (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,因为它的用法很奇怪),以便访问 [=15] 的 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)给的是full(串联对象),user._idreturns一个值,但是user._identityreturnsundefined(并且没有为此返回其他值。是否了解为什么会发生这种情况或我应该采取不同的方法?

注意:这似乎是由 _.merge 调用引起的。我正在使用 lodash v.2.4.2

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

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

还不错!