我正在尝试将passport-facebook策略应用到我的应用程序中,但是我似乎遇到了一些问题。
我可以成功调用Facebook并获得回复,但是在尝试将用户保存到我的数据库时,没有任何反应。
在我的下面的代码中,我想检查用户是否已经存在于数据库中,如果他们已经存在,则返回他们的详细信息,如果他们没有创建新条目。
passport.use(new FacebookStrategy({
clientID: '123',
clientSecret: '123',
callbackURL: 'http://localhost:1337/auth/facebook/callback',
profileFields: ['email']
},
function(accessToken, refreshToken, profile, done) {
User.findOne({ email: profile.emails[0].value}, function(err, user){
if (err) { return done(err); }
if (!user || user == 'false') {
console.log('No user found');
console.log(profile.id);
User.create({facebookId: profile.id, email: profile.emails[0].value}, function(err, user){
return done(null, user, { message: 'Facebook user created'});
})
} else {
console.log(user);
return done(null, user, { message: 'User already registered'});
}
})
}
));
我可以很好地注销配置文件ID,以及电子邮件,但是User.create语句不会运行。
我也实施了本地护照,如果我将数据发布到我的用户模型,它就可以很好地创建用户。
作为参考,我的用户模型如下:
module.exports = {
connection: 'someMongodbServer',
attributes: {
facebookId: {
type: 'integer',
unique: true
},
email: {
type: 'email',
required: true,
unique: true,
},
password: {
type: 'string',
minLength: 6,
},
toJSON: function() {
var obj = this.toObject();
delete obj.password;
return obj;
}
},
beforeCreate: function(user, cb) {
if(user.password){
bcrypt.genSalt(10, function(err, salt){
bcrypt.hash(user.password, salt, function(err, hash){
if(err) {
console.log(err);
cb(err)
} else {
user.password = hash;
cb();
}
});
});
}
}
};
有谁知道我可能会出错?
答案 0 :(得分:0)
管理解决它,代表我是一个愚蠢的错误。
User模型调用beforeCreate函数来散列密码。由于我使用Passport的Facebook策略,Facebook用户没有密码所以我添加了一个if语句来检查这个。
if(user.password){
我错过的是此函数中的回调,如果它们不是密码。 beforeCreate函数的解决方案是:
beforeCreate: function(user, cb) {
if(user.password){
bcrypt.genSalt(10, function(err, salt){
bcrypt.hash(user.password, salt, function(err, hash){
if(err) {
console.log(err);
cb(err)
} else {
user.password = hash;
cb();
}
});
});
}
cb();
}