如何 在NodeJs搭建GraphQL service Apollo Server (1)

 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 发布的话:


下一篇 将会结合Express 介绍如何使用exprss + GraphQl做一个rest  APIs.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值