提问者:小点点

Graphql postgresql promise在返回结果后执行


我在试用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');
        }
    })
});

我注释了我的结果,只是想了解一下返回静态内容的情况,结果似乎在then()内时不会返回到graphisql(这意味着在then()之前完成的解析)。输出:

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

}

我可以通过将静态返回数组放在console.log(“finished”)下面来验证这一点,它可以正确地返回数据。

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

显示在GraphiQL中:

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

看来我的诺言没有得到兑现。是不是我的查询函数中缺少了什么东西,导致解析不等待我的结果?如有任何帮助,我们将不胜感激。

更新1

如果我将查询包装在一个承诺中,它似乎会起作用:

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