如何 在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.

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js可以用来搭建服务器,以下是一些步骤和代码示例: 1. 首先,你需要安装Node.js和Express框架。可以使用npm命令来安装它们。 2. 创建一个service.js文件,并在其中导入Express模块和创建一个Express应用程序的实例。 3. 使用app.listen方法来配置服务器的端口号,并启动服务器。 4. 可以使用app.get方法来定义GET请求的路由和处理函数。例如,可以创建一个'/api/list'的路由,当收到GET请求时,返回一个包含数据的JSON对象。 5. 可以使用app.post方法来定义POST请求的路由和处理函数。例如,可以创建一个'/api/setList'的路由,当收到POST请求时,将请求体中的数据存储起来,并返回一个包含存储数据的JSON对象。 6. 可以使用app.use方法来配置中间件。例如,可以使用express.static中间件来将静态文件部署到服务器上。 7. 最后,通过运行node service.js命令来启动服务器。 下面是一个示例代码: ```javascript const express = require('express'); const app = express(); app.use(express.static('img')); app.use(express.urlencoded({ extended: false })); app.get('/api/list', (req, res) => { res.send({ code: 200, data: \[{ name: 1 }, { name: 2 }, { name: 3 }\] }); }); app.post('/api/setList', (req, res) => { const newList = req.body; console.log(newList); res.send({ newList }); }); app.listen(9588, () => { console.log('服务器启动成功'); }); ``` 通过以上步骤和代码示例,你可以使用Node.js搭建一个简单的服务器,并处理GET和POST请求。 #### 引用[.reference_title] - *1* *2* [nodejs如何搭建服务器](https://blog.csdn.net/weixin_41472455/article/details/110274100)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [如何通过nodejs快速搭建一个服务器](https://blog.csdn.net/ct5211314/article/details/128282738)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值