2017-02-27 18 views
0

我正在尝试graphql。我从postgresql提取数据,除了在查询完成之前完成解析的一个问题之外,似乎每个工作都可以工作。我虽然我有我的查询承诺正常工作。在这里,我创建查询数据库我的课:返回结果后执行Graphql postgresql诺言

class PgPoolClient { 

    constructor(options) { 
     this.connection = options.connection; 
    } 

    query(sql, data = []) { 

     return new Promise((resolve, reject) => { 
      var pool = new pg.Pool(this.connection); 
      pool.connect((err, client, done) => { 
       if (err) { 
        reject({ 
         code: 505, 
         message: err.message, 
         entrys: [] 
        }); 
       } else { 
        client.query(sql, data, (err, results) => { 
         done(); 
         if (err) { 
          reject({ 
           code: 404, 
           message: err.message, 
           entrys: [] 
          }); 
         } else { 
          resolve({ 
           code: 200, 
           message: "ok", 
           entrys: results 
          }); 
         } 
        }); 
       } 
      }); 

      pool.on("error", (err, client) => { 
       reject({ 
        code: 505, 
        message: err.message, 
        entrys: {} 
       }); 
      }); 

     }); 
    } 
} 

这里是我的graphql查询:

const Query = new GraphQLObjectType({ 
    name: 'Query', 
    description: 'Root query object', 
    fields:() => ({ 
     accounts: { 
      type: new GraphQLList(Account), 
      resolve(root, args) { 

       const parameters = []; 
       pg.query(`SELECT 
id, token, user_identifier as userIdentifier, hash_password as hashPassword, 
is_enabled as isEnabled, security_type_id as securityTypeID, 
is_admin as isAdmin, ad_path as adPath, date_created as dateCreated, 
date_modified as dateModified, modified_by as modifiedBy 
FROM accounts.account`, parameters) 
       .then((result) => 
       { 
        console.log(result.entrys.rows); 
        //return result.entrys.rows; 
        return [ 
         { 
         id: '33333', 
         token: '111', 
         userIdentifier: 'test' 
         } 
        ] 

       }) 
       .catch((err) => 
       { 
        console.log(err); 
        return err.message; 
       }); 

       console.log('finished'); 
     } 
    }) 
}); 

我评论了我的结果,只是想看看有关返回静态内容和看来,当它的内部()结果不会返回到graphisql(意味着在then()之前完成的解析)。与输出:

{ 
    "data": { 
    "accounts": null 
} 

}

我能够把静态回报阵列的console.log(“完成”)来验证此,它正确地返回数据。

console.log('finished'); 
return [ 
    { 
    id: '33333', 
    token: '111', 
    userIdentifier: 'test' 
    } 
]     

这表明了在graphiql:

{ 
    "data": { 
    "accounts": [ 
     { 
     "id": "33333", 
     "token": "111", 
     "userIdentifier": "test" 
     } 
    ] 
    } 
} 

如此看来,我的承诺没有被娇娇。我的查询函数中是否存在导致决心不等待结果的错误?任何帮助,将不胜感激。

更新1

看来,如果我wrapp查询的承诺它的工作原理:

return new Promise((resolve, reject) => { 

pg.query(`SELECT 
id, token, user_identifier as userIdentifier, hash_password as hashPassword, 
is_enabled as isEnabled, security_type_id as securityTypeID, 
is_admin as isAdmin, ad_path as adPath, date_created as dateCreated, 
date_modified as dateModified, modified_by as modifiedBy 
FROM accounts.account`, parameters) 
.then((result) => 
{ 
    console.log(result.entrys.rows); 
    //return result.entrys.rows; 
    resolve([ 
     { 
     id: '33333', 
     token: '111', 
     userIdentifier: 'test' 
     } 
    ]); 

}) 
.catch((err) => 
{ 
    console.log(err); 
    reject(err.message); 
}); 

我想我的问题是,如果我的查询功能已经被包裹在一个无极,为什么我必须再做一次?

回答

1

您的resolve功能需要返回承诺。当你明确地将其包含在一个承诺中时,它会起作用,因为您已将其返回。如果你返回调用pg.query的结果,它应该没有这个工作。

const Query = new GraphQLObjectType({ 
name: 'Query', 
description: 'Root query object', 
fields:() => ({ 
    accounts: { 
     type: new GraphQLList(Account), 
     resolve(root, args) { 
      const parameters = []; 
      return pg.query(`query`, parameters) 
      .then((result) => 
      { 
       console.log(result.entrys.rows); 
       //return result.entrys.rows; 
       return [ 
        { 
        id: '33333', 
        token: '111', 
        userIdentifier: 'test' 
        } 
       ] 
      }) 
      .catch((err) => 
      { 
       console.log(err); 
       return err.message; 
      }); 
      console.log('finished'); 
     } 
    }) 
}); 
+0

感谢您的建议 – adviner