如何解决如何在Apollo GraphQL服务器上同步使用Knexjs
如何使用Knexjs在Apollo 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);
行仅显示一个Promise {<pending>}
,并且在.then(function(rows) {console.log(rows)})
行被执行时(异步),主功能已经完成。
有没有办法获取数据库查询的结果,而不是第console.log(result);
行的Promise吗?
解决方法
如果您希望请求同步运行并等待结果,则需要添加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 (_,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')
还将使等待返回返回数据而不是承诺成为可能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。