使用Mongoose将ref填充到父级,并在使用passportjs进行身份验证后显示完整的父级

时间:2014-10-18 00:22:29

标签: node.js mongodb authentication mongoose-plugins passport.js

我有usersp的以下架构。 sp是服务提供商的缩写。服务提供者是用户,它具有对用户的引用。 我正在尝试使用NodeJS的PassportJS模块进行注册和唱歌。我已经能够注册sp,我可以看到userssps集合中的MongoDB集合中的数据一直存在,但是我无法显示sp的完整数据。个人资料页。我只显示其用户数据。例如,我在身份验证后的个人资料页面中看不到sp的{​​{1}}数据。

以下是一些代码:

用户架构:

spname

sp的架构

var userSchema = mongoose.Schema({
        ip: String,
        local            : {
            email        : String,
            password     : String
        }
        name: String ,
        created: { type: Date, default: Date.now },
    })
    .plugin(mongooseRole, {
        roles: ['public', 'user', 'sp', 'admin'],
        accessLevels: {
            'public': ['public', 'user', 'sp', 'admin'],
            'anon': ['public'],
            'user': ['user', 'admin'],
            'sp': ['sp', 'admin'],
            'admin': ['admin']
    }
});
var User = mongoose.model("User", userSchema);

用于登录的PassportJS代码:

var spSchema = mongoose.Schema({
    user: { type: Schema.ObjectId, ref: 'User' },
    spname: String,
});
var SP = mongoose.model("SP", spSchema);

显示个人资料:

//serialization/deserialization code
    // used to serialize the user for the session
    passport.serializeUser(function(user, done) {
        done(null, user.id);
    });

    // used to deserialize the user
    passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });


//authentication code
    passport.use('local-login', new LocalStrategy({
            usernameField : 'email',
            passwordField : 'password',
            passReqToCallback : true
        },
        function(req, email, password, done) {

            User.findOne({ 'local.email' :  email }, function(err, user) {

                if(user.role == 'sp') {
                    SP.findOne({ user: user._id }).populate('user').exec(function(err, sp) {
                        if (err)
                            return done(err);
                        if (!sp.user)
                            return done(null, false, req.flash('loginMessage', 'No sp user found.')); 

                        if (!sp.user.validPassword(password))
                            return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); 
                        return done(null, sp);
                    });
                } 

                if (err)
                    return done(err);

                if (!user)
                    return done(null, false, req.flash('loginMessage', 'No user found.')); 

                if (!user.validPassword(password))
                    return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); 

                return done(null, user);
            });

        }));

profile.ejs

app.get('/profile', isLoggedIn, function (req, res) {

    res.render('profile', {
        user: req.user
    });
});

有人可以帮我了解我应该做什么来显示整个<%= user %> 对象及其所有数据吗?

1 个答案:

答案 0 :(得分:1)

您只需在反序列化时查询User架构。如果需要,您需要反序列化sp。我对您的情况并不完全确定,但您似乎要对User SP进行身份验证,在这种情况下,您应该类似地反序列化User SP(如果User返回空)。这样的事情可能是:

// used to deserialize the user
passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
        if (user.role == 'sp')
            SP.findOne({user: user_id}).populate('user').exec(function(err, sp) {
                done(err, sp);
            });
        else done(err, user);
    });
});