在REST API中处理承诺错误的位置?

时间:2016-06-03 04:06:59

标签: javascript node.js rest promise

例如,如果用户首先使用login登录facebook,则可以使用email+password流,用户可以使用facebookuser credential + user entity进行登录在facebook [email + id]下创建。

同一位用户可能会忘记他们使用了facebook,并尝试创建email登录信息。现在发生的情况是,用户必须sign in使用facebook帐户才能为email credential创建新的user entity

Todo我有两个类,1个(login_handler.js),2个(user.js,处理所有查询)。

我的user.js课程内有:

基本上这是做什么的,检查用户是否存在,是否存在以及userType(他们登录的帐户类型)与数据库中的accountType(email,facebook)不同。我想知道我是否应该在我的保证链(login_handler.js)中或直接在类中处理这种类型的逻辑?

checkUserExists () {
    console.log ("BEFORE ERROR")
    const {externalId, email, password, userType} = this;
    var query;
    if (this.userType == 'email')
      query = `select * from content_usercredential where email = '${email}' AND secret = '${password}'`;
    else if (this.userType == 'facebook'){
      query = `select * from content_usercredential where email = '${email} AND externalId = '${externalId}'`;
    }

  return new Promise ( (fulfill, reject) => {
       conn.query(query, (err, user) => {
          if (user.accountType == 'facebook' && this.userType == 'email') {
             // Should I handle this here, or in my login_handler promise chain?
             this.res.json("you must login with facbeook", session data here...so when they sign in we can pick up where we left off);
             throw new Error ("Return confirmation object to client");
       });
   });

login_handler.js

我应该在这里处理并抛出错误,以便我的promise链的其余部分不会执行,或者我应该直接在错误发生的地方抛出错误(在user.js类中)。

  User.checkUserExists()
  .then ( () => {
      // Should I handle here OR in my user.js class file?
      if (User.needsToConfirm) {
          this.res.json("you must login with facbeook", session data here...so when they sign in we can pick up where we left off);
          throw new Error("OR should I return the confirmation object here?"});
     }
  }).then( () => return createNewUserEntity())
    .then( () => return createUserCredential())   

2 个答案:

答案 0 :(得分:2)

我建议你使用蓝鸟而不是原生的Promise。 (http://bluebirdjs.com/docs/getting-started.html

请按照以下步骤操作

const Promise = require('bluebird')

return Promise.try(() => User.checkUserExists())
  .then ( () => {
      // Should I handle here OR in my user.js class file?
      if (User.needsToConfirm) {
          this.res.json("you must login with facbeook", session data here...so when they sign in we can pick up where we left off)
          throw 'exit1'
      }
  }).then( () => return createNewUserEntity())
    .then( () => return createUserCredential()) 
    .catch(e => {
       if (e === 'exit1') {
          // your error
       }
       else {
          // system error
       }
    })

答案 1 :(得分:2)

你的两个班级有明确的责任。 User.js访问数据层并login_handler.js处理登录请求和回复

考虑将来的一段时间,您必须更换数据访问层(User.js)或登录服务层(login_handler.js)。更改数据层将导致重新实现响应,更改服务层将导致更改数据层,因为您必须重新实现响应。

因此,请确保您的课程始终有明确的责任和最小的共同互动。