User.findOrCreate不是一个函数passport-facebook

我跟着护照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是做什么的? 我是否需要将其编辑为与我的代码相关的内容? 我没有名为configuration文件的模型。

这是我的用户模型:

 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); 

这是你可以在你的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); } }); }; 

如果findOne没有结果User.Create({facebookID:profile.id,username:profile.displayName …}) 。 你应该在你的架构上添加facebookID,如果没有,你将为每个facebook连接创build一个用户。