Node.js和passport-facebook回调永远不会结束

时间:2013-05-04 02:58:05

标签: node.js passport.js

任何人都可以帮我解决这个问题吗?回调永远不会结束。我跟随护照facebook指南和护照-facebook指南,两者都有同样的问题。 这是我的代码:

passport.use(new FacebookStrategy({
  clientID: FACEBOOK_APP_ID,
  clientSecret: FACEBOOK_APP_SECRET,
  callbackURL: "http://localhost:3000/auth/facebook/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    User.findOrCreate({ facebookId: profile.id },{name:profile.displayName}, 
    function (err,  user) {
      return done(err, user);
    });
  }
));

app.get('/auth/facebook', passport.authenticate('facebook'));

app.get('/auth/facebook/callback',
  passport.authenticate('facebook', { failureRedirect: '/error',
                                      successRedirect: '/success' }));

配置和依赖

node.js版本0.10

“express”:“3.2.1”,

“护照”:“0.1.16”,

“passport-facebook”:“0.1.5”,

“paypal-ipn”:“1.0.1”,

“ejs”:“0.8.3”,

“sequelize”:“1.7.0-alpha1”,

“winston”:“0.7.1”,

“mysql”:“2.0.0-alpha8”

1 个答案:

答案 0 :(得分:2)

findOrCreate()这样的Sequelize方法不接受回调函数来处理结果,但返回a promise-like object

User.findOrCreate(
  { facebookId : profile.id },
  { name       : profile.displayName}
).success(function(user) { // called when findOrCreate was successful
  done(null, user);
}).error(function(err) {   // called when findOrCreate failed
  done(err);
});

或者,您可以使用completedone作为快捷方式(它们使用与策略的err, result方法相同的done签名,因此您可以直接传递):

User.findOrCreate(
  { facebookId : profile.id },
  { name       : profile.displayName}
).complete(done);
// or
User.findOrCreate(
  { facebookId : profile.id },
  { name       : profile.displayName}
).done(done);

在您的情况下,您提供给findOrCreate()的回调永远不会被调用,并且永远不会调用策略回调的done()函数。