GraphQL基于nodejs的例子,如何运行第一个demo?
发布于 作者:苏南大叔 来源:程序如此灵动~苏南大叔在上一篇文章中阐述了大量自己对graphql
究竟是什么的观点后,本文将要讲述第一个graphql
的小例子(代码基于node
)。当然,作为第一个入门例子,您也可以根据您的喜好选择其它语言的demo
,在官方的页面上都有列出各种选择。这里苏南大叔就是随手选了个nodejs
的范例。
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述如何基于nodejs
运行第一个graphql
的代码。
测试环境:win10
,node@16.14.0
,graphql@15.8.0
/graphql@16.3.0
。
下载graphql
前一篇文章中,苏南大叔已经详细阐述了GraphQL
究竟是个什么事物的观点,它是一个新的接口查询语言。如果您还不知道它具体是个什么事物,可以点下面的链接查看:
关于下载graphql
,鉴于它的极为奇特的功用及身份。所以,它并不是一款独立的软件。它只是一款标准,每个语言下都有自己的基于其标准的实现。所以,在每个不同的高级编程语言(node
/java
/php
/go
等等)里面,graphql
它都是单独下载的。
本文中的代码是基于nodejs
的。当前最新版是graphql@16.3.0
,安装命令是:
npm i graphql --save
然而普及程度更多的版本是15
系列。如果降级安装的话,命令是:
npm i graphql@15 --save
有关nodejs
及npm
如何安装,如何加速的文章,可以点击下面的链接:
- https://newsn.net/say/centos-node-bin-2.html
- https://newsn.net/say/centos-node-bin.html
- https://newsn.net/say/centos-node.html
- https://newsn.net/say/node-n.html
- https://newsn.net/say/node-nvm.html
官方原版代码
这里本地运行一个nodejs
的代码,例子是官方提供的,见下面的链接:
基于nodejs
的官方原版范例代码:
var { graphql, buildSchema } = require('graphql');
var schema = buildSchema(`
type Query {
hello: String
}
`);
var root = { hello: () => 'Hello world!' };
graphql(schema, '{ hello }', root).then((response) => {
console.log(response);
});
版本差异
目前GraphQL
正处在15
和16
的版本更替过程中,它们的函数并不一致,所以,您可能会碰到一些错误提示信息。不必着急,并不是你复制错代码了,也不是查询语句的问题。只不过是大版本更替,api
函数不兼容导致的。这其中的道理,可以点击下面的链接了解:
所以,如果您碰到这样的错误提示,就说明您本地的graphql
的版本和代码的调用并不是兼容的。
Error: Expected undefined to be a GraphQL schema.
这个错误并不是代码上所显示的schema
的问题,并不要纠结于是不是schema
的语法错误。
方案一:查看本地graphql
版本号的方法如下:
npm ls graphql
相关的说明文章,请点击:
方案二:代码查看已价值的GraphQL
版本号的方法:
var { version, versionInfo } = require('graphql');
console.log(version)
console.log(versionInfo)
改良版代码
对于本文来说,graphql
的15
和16
版本并不兼容,两者的差异在于最后的调用形式。苏南大叔改良版的代码如下:
var { graphql, buildSchema, versionInfo } = require('graphql');
var schema = buildSchema(`
type Query {
hello: String
}
`);
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);
});
}
else{
console.log("todo");
}
然而上面这个代码也就是针对15
和16
进行的切换,并没有处理其它版本的情况,所以请大家理性的复制代码。
graphql
的版本号是graphql@15
系列的话,那么运行下面的代码:
graphql(schema, '{ hello }', root).then((response) => {
console.log(response);
});
graphql
的版本号是graphql@16
系列的话,那么运行下面的代码:
graphql({
schema: schema,
source: '{ hello }',
rootValue: root
}).then((response) => {
console.log(response);
});
运行结果:
模拟用户输入部分:
- 在
GraphQL@15
中,graphql(schema, '{ hello }', root)
中的{ hello }
,就是模拟的输入数据。 - 在
GraphQL@16
中,这个{ hello }
查询语句,就体现为source
参数。
参考文献
总结
既然升级到了graphql@16
了,官方也不加个特别说明,导致大量新人懵逼。本文的代码正确运行,是基于本地的graphql
的版本号的。所以,请确认相关事宜。
更多graphql
的文章,请参考苏南大叔的博客:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。