模型创建返回undefined没有创建 - Sails JS

时间:2016-08-16 11:45:05

标签: node.js sails.js passport.js passport-facebook

我正在尝试将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();
          }
        });
      });
    }
  }
};

有谁知道我可能会出错?

1 个答案:

答案 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();
  }