GraphQL.js如何把schema定义单独成一个文件模块?
发布于 作者:苏南大叔 来源:程序如此灵动~
苏南大叔接着分析graphql的nodejs的代码,本文来实现一个伪需求,就是graphql定义schema的时候,如果schema定义比较大的话(应该行数都不会少),如何把这个schema数据结构单独成一个文件,这样的目录结构更清晰一些。

大家好,这里是苏南大叔的“程序如此灵动”博客,这里记录苏南大叔和计算机代码的故事。本文介绍在nodejs代码,schema文件定义单独成文件的方法。本文测试环境:win10,node@16.14.0,graphql@16.3.0,graphql-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-import-node/register的话,也可以在node的-r参数里面指定。
很奇怪的用法。
node -r graphql-import-node/register index.js
参考文献
- https://newsn.net/tag/graphql.html
- https://graphql.org/
- https://graphql.org/learn/
- https://graphql.org/code/
总结
本文中的伪需求完成,schema部分单独成文了,代码清晰了好多。更多graphql的文章,请点击苏南大叔的博客: