2

如何使用KnexjsApollo GraphQL Server的解析器上同步获取数据?例如,如果我运行以下查询:

const resolvers = {
    Query: {
        MySchema: (_, args, { dataSources }, info) => { 
            var result = db.knex.select('*')
                .from('SomeTable')
                .where({SomeColumn:'SomeValue'})
                .then(function(rows) {console.log(rows)})
                .catch(function(error) {console.error(error)});

           // Do something with the result here..
           console.log(result);
           return db.knex.select('*').from('SomeOtherTable')
        }
    }
}

该行console.log(result);仅显示 aPromise {<pending>}并且当该行.then(function(rows) {console.log(rows)})(异步)执行时,主函数已经完成。

有没有办法获得数据库查询的结果而不是在线承诺console.log(result);

4

1 回答 1

1

如果您希望您的请求同步运行并等待结果,您需要添加 async/await

MySchema: async (_, args, { dataSources }, info) => { 
    var result = await db.knex.select('*')
                       .from('SomeTable')
                       .where({SomeColumn:'SomeValue'})
    // result is now a value and not a promise
    console.log(result)
}

正如您所注意到的,我删除了不再相关的 .then 和 .catch 。

我强烈建议在您等待的承诺周围添加一个 try/catch 以避免未捕获的错误。

MySchema: async (_, args, { dataSources }, info) => { 
    try {
        var result = await db.knex.select('*')
                           .from('SomeTable')
                           .where({SomeColumn:'SomeValue'})
        // result is now a value and not a promise
        console.log(result)
    } catch (e) {
        // handle e
    }
}

顺便说一句,这return db.knex.select('*').from('SomeOtherTable')将有利于等待以及返回数据而不是承诺。

于 2020-08-24T13:22:08.763 回答