2017-05-12 13 views
1

的Hello World示例如下:如何从需要返回语句的GraphQL解析器中调用异步node.js函数?创建一个简单的GraphQL实现提供<a href="http://graphql.org/graphql-js" rel="nofollow noreferrer">graphql.org/graphql-js</a>

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

我试图运行变压器内的异步函数,例如数据库调用,我不能似乎弄清楚如何使这项工作:

我想要做的事:

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

我试图用承诺,但似乎没有要逃避的一种方式承诺没有ent进行回调。我也尝试过用各种方法来封装异步函数,强制它是同步的,但最终不得不从异步函数中返回一个值,同样的问题。我觉得这不能太复杂,我的意思是GraphQL-JS是由Facebook编写的。

回答

2

所以这个问题原来是你在解决问题后觉得非常愚蠢的问题之一,但是因为我花了多长时间来解决问题,我会回答我自己的问题,以便其他人能够希望得到好处。

事实证明,GraphQL解析器函数必须返回一个值或者解析为该值的承诺。所以我试图用像这样的事:

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); 
}); 
相关问题