续集error handling

看看下面的代码示例,我不知道在最外层的sequelize任务中链接一个.catch()是否足够,而不是在每个看起来相当混乱的任务上链接它。

第二个问题是有可能使.then(instance, error)包含错误对象,如果有的话? 像mongoose那样,第一个参数总是err obj。 所以我不需要.catch一个错误,只需要在.catch .then()callback函数中处理。

 function facebookStrategy() { return new FacebookStrategy({ clientID: config.facebook.app_id, clientSecret: config.facebook.app_secret }, function (accessToken, refreshToken, profile, done) { process.nextTick(function () { models.User.findOrCreate({ where: {email: profile.emails[0].value} }).spread(function (user, created) { models.UserPassport.findOrCreate({ where: { // TODO(tsm): check out sequelize composite keys method: 'facebook', social_id: profile.id }, defaults: { method: 'facebook', token: accessToken, social_id: profile.id } }).spread(function (userPassport, created) { userPassport.setUser(user).then(function () { user.updateAttributes({ first_name: profile.name.givenName, last_name: profile.name.familyName }).then(function () { return done(null, user); }); }); }).catch(function (err) { console.log('Error occured: ', err); return done(err); }); }).catch(function (err) { console.log('Error occured: ', err); return done(err); }); }) }) } 

通过返回一个承诺,你可以链接它。

所以你可以做类似的事情

 function facebookStrategy() { return new FacebookStrategy({ clientID: config.facebook.app_id, clientSecret: config.facebook.app_secret }, function (accessToken, refreshToken, profile, done) { process.nextTick(function () { models.User.findOrCreate({ where: { email: profile.emails[0].value } }).spread(function (user, created) { return models.UserPassport.findOrCreate({ where: { // TODO(tsm): check out sequelize composite keys method: 'facebook', social_id: profile.id }, defaults: { method: 'facebook', token: accessToken, social_id: profile.id } }).spread(function (userPassport, created) { return userPassport.setUser(user).then(function () { return user.updateAttributes({ first_name: profile.name.givenName, last_name: profile.name.familyName }).then(function () { return done(null, user); }); }); }); }).catch(done); }); }); }