Javascript 续集错误处理

Javascript 续集错误处理,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,看看下面的示例代码,我想知道在最外层的sequelize任务上只链接一个.catch()是否足够,而不是总是在每个看起来很混乱的任务上链接它 第二个问题是是否可以使。然后(实例,错误)包含错误对象(如果有)?就像猫鼬一样,第一个参数总是errobj。因此,我不必。捕捉错误,只需在回调函数中处理它即可 function facebookStrategy() { return new FacebookStrategy({ clientID: config.facebook.app_id,

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

第二个问题是是否可以使
。然后(实例,错误)
包含错误对象(如果有)?就像猫鼬一样,第一个参数总是errobj。因此,我不必
。捕捉
错误,只需在
回调函数中处理它即可

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);
        });
    });
}

很酷,所以基本上所有sequelize查询方法都可以返回一个承诺,并且错误将冒泡到最外层。