我有user
和sp
的以下架构。 sp
是服务提供商的缩写。服务提供者是用户,它具有对用户的引用。
我正在尝试使用NodeJS的PassportJS模块进行注册和唱歌。我已经能够注册sp
,我可以看到users
和sps
集合中的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 %>
对象及其所有数据吗?
答案 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);
});
});