GraphQL解析粒度介绍GraphQL的基本概念可以参考上一篇文章《更轻松的使用GraphQL》。困惑第一次看到GraphQL的时候,很容易被它强大的介绍所吸引,但是当我想进一步尝试的时候,却发现它的“helloworld”并不是很友好,很容易让人退缩。我们先看官方(grpahql-js)的例子:varschema=newGraphQLSchema({query:newGraphQLObjectType({name:'RootQueryType',fields:{hello:{type:GraphQLString,resolve(){return'world';}}})});其中,resolve函数定义部分换成了更直观的写法(伪代码):{//每个字段都有一个独立的resolve函数hello:functionresolve(){return'world';}}这很可怕。如果一个数据结构的每个成员都要定义一个resolve函数,那么工作量和开发复杂度都难以接受,所以很多人看了官方的READMEReturn后都心惊肉跳。但实际上GraphQL可以对整个对象使用一个resolve函数来获取所有字段的数据。伪代码大概是:{//Theentireobjectusesaresolvefunctionhello,xxx,foo,...}:functionresolve(){return{hello:"world",foo:"bar",...};}在实战中,我们还是以论坛帖子为例:1.schema定义userdefinition:#userschematypeUser{uid:ID!名称:字符串!avatar:String!}Postdefinition:#postschematypePost{pid:ID!标题:字符串!内容:字符串!author:User!}2.提供查询方法定义Querydefinition:typeQuery{post(id:ID):Post}3.编写对应的resolve函数'usestrict'constfakeDB=require('../../fakeDB');functionfetchPostById(root,{id},ctx){//post查询,第二个参数是查询语句中的输入letpid=parseInt(id);returnfakeDB.getPostById(pid);}//FunctionfetchUserByAuthorId(root,args,ctx){//查询并解析post下的author字段执行post数据查询后,如果需要author字段,该函数会再次被召唤。root参数就是上一步查询到的post数据。让uid=root.authorId;returnfakeDB.getUserById(uid);}constpostReolvers={查询:{post:fetchPostById,},Post:{//嵌套数据结构的解决方案函数author:fetchUserByAuthorId,},};module.exports=postReolvers;4、查询结果可以通过上面的fetchPostById函数(整个Post数据结构)查询指定id的post详情,而不是为Post的每个字段定义一个resolve函数:查询返回结果如下:{"data":{"post":{"pid":"1","title":"foo","content":"xxx","author":{"uid":"1","name":"Tom","avatar":"https://pre00.deviantart.net/2930/th/pre/i/2014/182/a/2/tom_cat_by_1997ael-d7ougoa.png"}}}}结论我希望本文可以帮助您初步了解GraphQL。不要被官方的“helloworld”吓跑,但是你可以进一步尝试GraphQL欢迎使用更简单的GraphQL包库:easy-graphql
