我遵循了passport-facebook的github指南,这是我得到的结果:
User.findOrCreate不是函数
我在passport.js中有这段代码:
passport.use(new FacebookStrategy({
clientID : configAuth.facebookAuth.clientID,
clientSecret : configAuth.facebookAuth.clientSecret,
callbackURL : configAuth.facebookAuth.callbackURL
},
function(accessToken, refreshToken, profile, done) {
User.findOrCreate({ facebookId: profile.id }, function (err, user) {
return done(err, user);
});
}
));
我是否需要自己编写findOrCreate方法?我以为mongoose正在处理这件事?
另外,profile.id有什么作用?我是否需要将其编辑为与我的代码相关的内容?我没有名为profile的模型。
这是我的用户模型:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var crypto = require('crypto');
var jwt = require('jsonwebtoken');
var UserSchema = new mongoose.Schema({
username: { type: String, lowercase: true, unique: true },
firstname: { type: String},
lastname: { type: String},
difficulty: { type: String},
isstudent: { type: Boolean },
haschildren: { type: Boolean},
gender: { type: String },
email: { type: String, unique: true},
birthdate: String,
isdoingchallenges: { type: Boolean },
challengescompleted: [{ type: ObjectId, ref: 'Challenge' }],
currentchallenge: { type: ObjectId, ref: 'Challenge' },
challengessuggestions: [{ type: ObjectId, ref: 'Challenge' }],
isfacebooklogin:{type:Boolean},
facebookid:{type:String},
hash: String,
salt: String
});
UserSchema.methods.setPassword = function(password){
this.salt = crypto.randomBytes(16).toString('hex');
this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
};
UserSchema.methods.validPassword = function(password) {
var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
return this.hash === hash;
};
UserSchema.methods.generateJWT = function() {
// set expiration to 60 days
var today = new Date();
var exp = new Date(today);
exp.setDate(today.getDate() + 60);
return jwt.sign({
_id: this._id,
username: this.username,
exp: parseInt(exp.getTime() / 1000),
}, 'SECRET');
};
mongoose.model('AppUser', UserSchema);
答案 0 :(得分:2)
这是您在mongoose架构/模型上添加静态方法的方法
userSchema.statics.findOrCreate = function findOrCreate(profile, cb){
var userObj = new this();
this.findOne({_id : profile.id},function(err,result){
if(!result){
userObj.username = profile.displayName;
//....
userObj.save(cb);
}else{
cb(err,result);
}
});
};
答案 1 :(得分:2)
npm install mongoose-findorcreate
const findOrCreate = require("mongoose-findorcreate");
yourSchema.plugin(findOrCreate);
中提琴!大功告成!
答案 2 :(得分:0)
是的,让你自己的findOrCreate方法包含一个User.findOne({facebookID:profile.id},回调)然后如果findOne没有结果一个User.Create({facebookID:profile.id,username:profile.displayName .. 。))。 你应该在你的架构上添加facebookID,否则你将为每个facebook连接创建一个用户。