当使用passport-facebook时,mongoose-findorcreate写入重复的用户

我正在尝试使用passportJS来设置用户身份validation。 我决定使用这个名为mongoose-findorcreate的npm包,而不是写一个findOrCreate函数来自己处理护照。

所以现在我正在testing我的应用程序,我可以login使用我的Facebook的凭据,如预期的,但问题是,我在我的数据库中获取多个条目相同的Facebooklogin。

这是我的用户模型:

let mongoose = require('mongoose'); let Schema = mongoose.Schema; let findOrCreate = require('mongoose-findorcreate'); // User schema definition let UserSchema = new Schema( { provider: { type: String, required: true }, id: { type: String, default: 'unknown' }, displayName: { type: String, default: 'unknown' }, name: { type: Object }, emails: { type: Array }, photos: { type: Array }, createdAt: { type: Date, default: Date.now }, updatedAt: { type: Date, default: Date.now }, } ); UserSchema.plugin(findOrCreate); // Sets the updatedAt parameter equal to the current time UserSchema.pre('save', (next) => { now = new Date(); if(!this.updatedAt) { this.updatedAt = now; } next(); }); module.exports = mongoose.model('user', UserSchema); 

这些是我的路线:

 let passport = require('passport'); let FacebookStrategy = require('passport-facebook').Strategy; let User = require('../models/user'); passport.use(new FacebookStrategy({ clientID: 12345, clientSecret: 'supersecretsecret', callbackURL: 'http://localhost:1337/auth/facebook/callback' }, (accessToken, refreshToken, profile, done) => { User.findOrCreate( profile, (err, user) => { if (err) { return done(err); } done(null, user); }) } )); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); function redirectFB() { return passport.authenticate('facebook'); } function callbackFB() { return passport.authenticate('facebook', { successRedirect: '/word', failureRedirect: '/' }) } module.exports = { redirectFB, callbackFB }; 

重复用户的一个例子:

 { "_id":ObjectId("584ade8915644f1186fa8a96"), "provider":"facebook", "updatedAt": ISODate("2016-12-09T16:40:41.921 Z"), "createdAt": ISODate("2016-12-09T16:40:41.921 Z"), "photos":[ ], "emails":[ ], "displayName":"Miha Šušteršič", "id":"10154914634234238", "__v":0 }{ "_id":ObjectId("584adea3b8adfb11948ed1d6"), "provider":"facebook", "updatedAt": ISODate("2016-12-09T16:41:07.626 Z"), "createdAt": ISODate("2016-12-09T16:41:07.625 Z"), "photos":[ ], "emails":[ ], "displayName":"Miha Šušteršič", "id":"10154914634234238", "__v":0 } 

我无法弄清楚这是否是我的代码问题(将configuration文件传递给findOrCreate函数。

findOrCreate的原因是因为findOrCreate查询将整个profile对象传递到查询条件中。

如果你看这里: https : //github.com/drudge/mongoose-findorcreate/blob/master/index.js#L22

根据您从Facebook获取的数据types,您的查询将始终返回空白,除非configuration文件对象完全匹配您的架构。

你可以在这里做的是这样的:

 User.findOrCreate({ provider: profile.provider, id: profile.id, .... }, (err, user) => { if (err) { return done(err); } done(null, user); }) 

而不是profile传递{ provider: profile.provider, id: profile.id, .... }

当然,修正{ provider: profile.provider, id: profile.id, .... }与您的模式定义相匹配。

发现问题 – 我需要以正确的格式将用户数据传递给findOrCreate函数。

 User.findOrCreate( profile._json, (err, user) => { if (err) { return done(err); } done(null, user); })