苏南大叔接着分析graphqlnodejs的代码,本文来实现一个伪需求,就是graphql定义schema的时候,如果schema定义比较大的话(应该行数都不会少),如何把这个schema数据结构单独成一个文件,这样的目录结构更清晰一些。

苏南大叔:GraphQL.js如何把schema定义单独成一个文件模块? - 单独schema文件
GraphQL.js如何把schema定义单独成一个文件模块?(图3-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里记录苏南大叔和计算机代码的故事。本文介绍在nodejs代码,schema文件定义单独成文件的方法。本文测试环境:win10node@16.14.0graphql@16.3.0graphql-import-node@0.0.4

本文中记载的方法,并不是个太好的方法,仅仅是个伪需求。因为schema后续都是用.js代码描述的。所以,这种情况的应用场景也不是很多。

安装graphql-import-node模块

graphql-import-node官方地址:

安装姿势:

npm i graphql-import-node --save

使用基本姿势:

var { buildASTSchema } = require('graphql');
require('graphql-import-node/register');
var schema2 = require('./2.graphql');
var schema = buildASTSchema(schema2);
注意:这里使用的是buildASTSchema(),而不是buildSchema()

改造版的graphql范例

前一篇范例文章,把其中的schema定义部分,单独拿出来成文。见这里:

type Query {
    hello: String
}

上面这种结构定义方式,官方叫做SDL,全称是Schema Definition Language。说明见这里:

改造代码如下:

var { graphql, buildASTSchema, versionInfo, } = require('graphql');
require('graphql-import-node/register');
var schema2 = require('./2.graphql');
var schema = buildASTSchema(schema2);
var root = { hello: () => 'Hello world!' };
console.log(versionInfo)
if (versionInfo.major == 15) {
  graphql(schema, '{ hello }', root).then((response) => {
    console.log(response);
  });
}
else if (versionInfo.major == 16)  {
  graphql({
    schema: schema,
    source: '{ hello }',
    rootValue: root
  }).then((response) => {
    console.log(response);
  });
}

值得注意的是:原来的buildSchema也变成了buildASTSchema

苏南大叔:GraphQL.js如何把schema定义单独成一个文件模块? - 代码结构
GraphQL.js如何把schema定义单独成一个文件模块?(图3-2)

另外一种使用方式

官方文档里面,还有提到:
如果不想在代码里面写graphql-import-node/register的话,也可以在node-r参数里面指定。

很奇怪的用法。
node -r graphql-import-node/register index.js

苏南大叔:GraphQL.js如何把schema定义单独成一个文件模块? - 另外一种运行方式
GraphQL.js如何把schema定义单独成一个文件模块?(图3-3)

参考文献

总结

本文中的伪需求完成,schema部分单独成文了,代码清晰了好多。更多graphql的文章,请点击苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。