Graphql在国内是真不火,至于原因网上讨论的也蛮多的.就我个人而言.学习成本很高,资料很少.
- 适合人员:全栈开发.
- 使用场景: 也是它的优势所查即所得,绝不给你多余没用的数据回来.
0.了解下什么是GraphQl
GraphQL 简介:
GraphQL is a query language for your API, and a server-side runtime for executing queries using a type system you define for your data. GraphQL isn’t tied to any specific database or storage engine and is instead backed by your existing code and data.
总结下:
- GraphQl 是一个基于API的查询语言, (语法上支持很多语言如:python, php, js, java...)
- 可以在服务端运行,而且可以根据定义的数据类型(数据字典)进行查询
- GraphQl 不关心你用的什么的db存储
有点懵是吗? 比较有意思的就是最后一句:说白了,我不是数据源啊,我不是DB啊. 我是一个查询的API.给我的第一印象就是那要你有何用..... 其实呢,可以理解GraphQl就是一个管理SQL查询的插件,一个Nodejs的Middleware.这样更好点.这也是为什么在国内不是很火的原因.
在来看看都有哪写公司用,这只是一部分
1. 搭建Nodejs + express
这里不占篇幅,可以看我以往的文章有介绍5分钟了解 NodeJS 密码加密 + Token
2.GraphQl 安装
官网:Tools and Libraries | GraphQL找到自己想用的语言然后下面会看到好多好多库....
例如我用js 40+的库...
不过我既然用nodejs, 又是做serice端的.就选Apollo Server. 开始安装
npm install @apollo/server graphql
需要注意下,我选的是服务端的库,如果是想在前端使用Qraphql,后期我会补一个前端如何使用.
3.开始使用GraphQl
3.1 创建Graphql service
在项目的根目录下创建src->urils文件,然后创建service.mjs文件
servic.mjs
import { ApolloServer } from "@apollo/server"
import { startStandaloneServer } from "@apollo/server/standalone"
const server = new ApolloServer({
typeDefs,
resolvers,
})
const { url } = await startStandaloneServer(server)
console.log(`🚀 Server ready at ${url}`)
3.2编写GraphQL的schema
官网的基本架子, 然后开始补充代码
首先定义我们需要查询字段的名称和类型 ,注意我们返回的数据是一个数组的对象类型,这有TypeScript基础的就很轻松了很像定义接口
const typeDefs = `#graphql
type Query {
getUerInfor: [UserInfo]
}
type UserInfo {
msg: String
name: String
age: Int
}
`
接下来设置数据源,因为是demo,直接就写一个demo的数据,后面会有如何链接db配合GraphQl的实际操作
let reArr = [
{
id:1,
msg: `hello world`,
name: `Evan `,
age: 18
},
{
id:2,
msg: `This is demo of the QraphQl`,
name: ` Learn & executing `,
age: 20
}
]
修改下apolloserver函数最终代码:
import {ApolloServer} from '@apollo/server'
import {startStandaloneServer} from '@apollo/server/standalone'
const typeDefs = `#graphql
type Query {
getUerInfor: [UserInfo]
}
type UserInfo {
msg: String
name: String
age: Int
}
`
let reArr = [
{
msg: `hello world`,
name: `Evan `,
age: 18
},
{
msg: `This is demo of the QraphQl`,
name: ` Learn & executing `,
age: 20
}
]
const resolvers = {
Query: {
getUerInfor:()=> reArr
}
}
const server = new ApolloServer({
typeDefs,
resolvers,
});
const {url} = await startStandaloneServer(server);
console.log("********************************")
console.log(`GraphQl Server started at ${url}`)
console.log("********************************")
3.3 挂载nodejs服务
GraphQl有个自带的ui调试server.开发的阶段还是很有用的,所以在开发阶段我习惯在nodejs同时挂载两个服务。一个Nodejs的项目服务一个GraphQL的调试server.这里需要安装一个插件concurrently.
npm i concurrently
修改package.json的script
"scripts": {
"start": "node ./bin/www",
"dev": "nodemon ./bin/www",
"service": "concurrently \"nodemon ./bin/www\" \"nodemon ./src/utils/service.mjs\""
},
运行
yarn service
or
npm run service
结果显示:
4. 测试结果
4.1 Apollo server 测试
虽然是后端,但是我们也有GUI.打开游览器端口4000
一切运行正常,点击左侧添加Query和要查询的字段,例如msg
点击query按钮
结果出来了
4.2 在postman中测试
可以看到postman很好的潜入了Graphql
当然schema和type的类型有很多,有兴趣的可以查看下官方介绍
不尽支持参数传递还有数据的约束.这部分稍后会单独做一个.
看到这的你可能会有疑问,为什么要安装express ? 一直都没用上啊,挂载了2个服务明明只有Qraphql的server在runtime.如果单纯使用作为一个数据查询管理api的server,做docker的容器化以上完全够用了. 如果想做一个平台的rest api 发布的话: