如何从需要返回语句的GraphQLparsing器中调用asynchronousnode.js函数?

graphql.org/graphql-js提供的用于创build简单GraphQL实现的Hello World示例如下:

var { graphql, buildSchema } = require('graphql'); // Construct a schema, using GraphQL schema language var schema = buildSchema(` type Query { hello: String } `); // The root provides a resolver function for each API endpoint var root = { hello: () => { return 'Hello World!'; } }; // Run the GraphQL query '{ hello }' and print out the response graphql(schema, '{ hello }', root).then((response) => { console.log(response); }); 

我试图在parsing器中运行一个asynchronous函数,例如数据库调用,我似乎无法弄清楚如何使这个工作:

我在做什么:

 var { graphql, buildSchema } = require('graphql'); // Construct a schema, using GraphQL schema language var schema = buildSchema(` type Query { data: String } `); // The root provides a resolver function for each API endpoint var root = { data: () => { getData((data) => { return data; // Returns from callback, instead of from resolver } } }; // Run the GraphQL query '{ data }' and print out the response graphql(schema, '{ data }', root).then((response) => { console.log(response); }); 

我试图使用承诺,但似乎没有进入callback逃避承诺的方式。 我也试过各种包装asynchronousgetData函数的方法来强制它是同步的,但最终不得不从一个asynchronous函数返回一个值,同样的问题。 我觉得这不可能是复杂的,我的意思是GraphQL-JS是由Facebook编写的。

所以这个问题在你弄明白之后就成了你觉得非常愚蠢的问题之一,但是由于我花了很多时间在这个问题上苦苦挣扎,所以我会回答自己的问题,这样别人就可以得到希望。

事实certificate,GraphQLparsing器函数必须返回一个值或parsing为该值的承诺 。 所以我试图做的是这样的事情:

 var { graphql, buildSchema } = require('graphql'); // Construct a schema, using GraphQL schema language var schema = buildSchema(` type Query { data: String } `); // The root provides a resolver function for each API endpoint var root = { data: () => { getData((data) => { return data; // Returns from callback, instead of from resolver } } }; // Run the GraphQL query '{ data }' and print out the response graphql(schema, '{ data }', root).then((response) => { console.log(response); }); 

可以做这样的事情:

 var { graphql, buildSchema } = require('graphql'); // Construct a schema, using GraphQL schema language var schema = buildSchema(` type Query { data: String } `); let promiseData = () => { return new Promise((resolve, reject) => { getData((data) => { resolve(data); }); }); }; // The root provides a resolver function for each API endpoint var root = { data: () => { return promiseData(); } }; // Run the GraphQL query '{ data }' and print out the response graphql(schema, '{ data }', root).then((response) => { console.log(response); });