Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mongoose Findor在使用passport facebook时创建重复用户_Node.js_Mongoose_Passport.js_Passport Facebook - Fatal编程技术网

Node.js mongoose Findor在使用passport facebook时创建重复用户

Node.js mongoose Findor在使用passport facebook时创建重复用户,node.js,mongoose,passport.js,passport-facebook,Node.js,Mongoose,Passport.js,Passport Facebook,我正在尝试使用passportJS设置用户身份验证。我决定使用这个名为mongoose findorcreate的npm包,而不是自己编写一个findorcreate函数来处理passport 因此,现在我正在测试我的应用程序,我可以按预期使用我的facebook凭据登录,但问题是,我在数据库中为同一个facebook登录获取多个条目 这是我的用户模型: let mongoose = require('mongoose'); let Schema = mongoose.Schema; let

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

因此,现在我正在测试我的应用程序,我可以按预期使用我的facebook凭据登录,但问题是,我在数据库中为同一个facebook登录获取多个条目

这是我的用户模型:

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
}

我无法确定这是否是我的代码的问题(是否将配置文件传递给
findOrCreate
函数)。

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

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

findOrCreate
无法工作的原因是
findOrCreate
查询正在将整个
profile
对象传递到查询条件中

如果你看这里:

根据您从Facebook返回的数据类型,除非profile对象与您的模式完全匹配,否则您的查询将始终返回空

您可以在这里执行以下操作:

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,…..}