首页 > 编程语言 >NodeJs + GraphQl 基于Apollo Server (2)

NodeJs + GraphQl 基于Apollo Server (2)

时间:2024-05-28 13:32:37浏览次数:26  
标签:const app Server server GraphQl rest import js Apollo

 基于上一篇的项目继续深入学习和介绍项目中如何使用GraphQl.本篇更侧重于实际项目中使用GraphQL.如果还没有了解基本的GraphQl知识和没用想要新建项目开始演练的可从
上一篇开始如何 在NodeJs搭建GraphQL service Apollo Server (1).

1.重构app.js和service.mjs

  1.1 修改service.mjs


上一篇提到我们使用的是epress-generator创建的的我们nodejs的express项目.所以我们当时开辟了两个进程挂载server. Aollo Server很贴心的支持express,所以我们现在(2024/5) 可以在一个进程挂载Nodejs的epress server 和Graphql的plugin server.
在Graphql的实际项目中我们更习惯使用http,rest这种方式去发送和获取数据.首先安装一个扩展包 datasource-rest

npm i @apollo/datasource-rest

Apollo的rest扩展包可以方便我fetch数据和编写fetch的一些列有relate的操作函数. 

在sercive.mjs

import { expressMiddleware } from '@apollo/server/express4';
import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer'

引入rest包和express的中间件包

创建express得server和设置Apollp server.并启动Apollo 的服务.

const httpServer = http.createServer(app);

// Set up Apollo Server
const server = new ApolloServer({
  typeDefs,
  resolvers,
  plugins: [ApolloServerPluginDrainHttpServer({ httpServer })],
});
await server.start();
1.2 创建nodejs中间件
 
app.use(
  '/graphql',
  cors(),
  bodyParser.json(),
  expressMiddleware(server, {
    context: async () => {
        const { cache } = server;
        return {
            dataSources: {
                randomUserApi: new GetUserApi({ cache }),
            },
        }
    }
  }),
);

其中 dataScource可以理解指代的是我们rest api的api集合.

randomUserApi 这个就是我们的api的接口名称

GetUserApi: 实际rest的实体(实例) 

     dataSources: {
                randomUserApi: new GetUserApi({ cache }),
            },

因为是一个实例所以当我有N多个API的时候我还会像抽出来单独管理比较简洁
所以单独抽出这个文件


1.3 getUserApi.js
 
import {RESTDataSource} from '@apollo/datasource-rest'
class GetUserApi extends RESTDataSource {
    constructor() {
        super();
        this.baseURL = "http://localhost:8001/";
    }
   
    async getUserInfor ()  {
        const result = await this.get(`test/`)
        return  result.results
    }
    async getUserInforByName (userName) {
        return await this.post(
            `getUserInforByName`,
            {body: {userName}},
        )
    }
    async deleteUserInforById (id) {
        return await this.delete(
            `deleteUserInforById/${encodeURIComponent(id)}`
        )
    }
}
export default GetUserApi

这个实例类中的几个method很好理解.分别给get, post,delete使用.post的请求只是一个条件传参.Graphql的多组参数,条件参数,多表关联查询以后会讲.

baseURL:这个指向的就是我们的数据源

1.4 创建测试数据 


作为demo的数据演示,我在db中加了一些测试数据,并开了一个db的server,postman看下测试的数据结构

实际的应用中db的数据源可以和Graphql的server使用同一个,例子中方便理解额外开了一个.

1.4. 创建schema& 封装typeDefs 

在utils下创建一个 schema.js文件, 并声明初我们的rest api的接口名称.这里的randomeDates就是我们声明的接口名称,其中dataScourece对应NodeJs中间件中的api集合.这里的意思是调用在这个接口下返回我们getUserInfor的函数的值(getUserInfor是我们getUserApi.js中定义.

const typeDefs = `#graphql
  enum LengthUnit {
    METER
    KILOMETER
    MILE
    FOOT
  }

  type  userDatas{
    username: String
    dateCreate:String
    id: String
    length(unit: LengthUnit = METER): Float
  }
  
  type Query {
    randomeDatas:[userDatas]
  }
`;

const resolvers = {
    Query: {
      randomeDatas: (_, __, {dataSources}) => 
          dataSources.randomUserApi.getUserInfor()
    },
  };

export {
    typeDefs,
    resolvers
}

回到service.mjs 引用我们的typeDefs和resolvers.最终如下

import { ApolloServer } from '@apollo/server';
import { expressMiddleware } from '@apollo/server/express4';
import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer'
// import {startStandaloneServer} from '@apollo/server/standalone'
import http from 'http';
import cors from 'cors';
import bodyParser from 'body-parser';
import app from '../../app.js'
import {typeDefs, resolvers} from './schema.js'
import GetUserApi from './getUserApi.js'

const httpServer = http.createServer(app);

// Set up Apollo Server
const server = new ApolloServer({
  typeDefs,
  resolvers,
  plugins: [ApolloServerPluginDrainHttpServer({ httpServer })],
});
await server.start();

app.use(
  '/graphql',
  cors(),
  bodyParser.json(),
  expressMiddleware(server, {
    context: async () => {
        const { cache } = server;
        return {
            dataSources: {
                randomUserApi: new GetUserApi({ cache }),
            },
        }
    }
  }),
);

await new Promise((resolve) => httpServer.listen({ port: 4000 }, resolve));
console.log(`

标签:const,app,Server,server,GraphQl,rest,import,js,Apollo
From: https://blog.csdn.net/EvanYYY1/article/details/139176354

相关文章

  • 1、sqlserver的临时表
    目录sqlserver的临时表1、本地临时表2、全局临时表3、使用临时表sqlserver的临时表在SQLServer中,临时表可以帮助我们在一个会话(Session)或者一个事务(Transaction)的范围内保存临时数据。它们可以是本地或全局的。1、本地临时表本地临时表的名称以一个井号(#)开始,它仅对当前......
  • SQLServer常用运维SQL整理
    今天线上SQLServer数据库的CPU被打爆了,紧急情况下,分析了数据库阻塞、连接分布、最耗CPU的TOP10SQL、查询SQL并行度配置、查询SQL重编译的原因等等整理了一些常用的SQL1. 查询数据库阻塞?1SELECT*FROM sys.sysprocessesWHEREblocked<>0查询......
  • SQLServer如何查询近3分钟最消耗CPU的SQL
    在SQLServer中,要查询近3分钟最消耗CPU的SQL语句,可以使用sys.dm_exec_query_stats动态管理视图结合sys.dm_exec_sql_text函数来获取SQL语句的文本。不过,直接查询近3分钟的数据可能需要一些额外的逻辑来筛选时间范围,因为sys.dm_exec_query_stats并不直接提供时间筛选的功能。一种......
  • SQLServer如何监控阻塞会话
    一、查询阻塞和被阻塞的会话SELECTr.session_idAS[BlockedSessionID],r.blocking_session_idAS[BlockingSessionID],r.wait_type,r.wait_time,r.wait_resource,s1.program_nameAS[BlockedProgramName],s1.login_nameAS[Blo......
  • SQLServer统计监控SQL执行计划突变的方法
    使用动态管理视图(DMVs)来检测SQL执行计划的突变,你需要关注那些能够提供查询执行统计和计划信息的视图。以下是一些可以用于此目的的DMVs以及相应的查询示例:sys.dm_exec_query_stats:这个视图提供了关于SQLServer中查询执行的统计信息,包括CPU时间、总工作时间、执行次数等。SE......
  • SQLServer如何监控阻塞会话
    一、查询阻塞和被阻塞的会话SELECTr.session_idAS[BlockedSessionID],r.blocking_session_idAS[BlockingSessionID],r.wait_type,r.wait_time,r.wait_resource,s1.program_nameAS[BlockedProgramName],s1.login_nameAS[Block......
  • OpenQA.Selenium.WebDriverException The HTTP request to the remote WebDriver serv
    OpenQA.Selenium.WebDriverException:“TheHTTPrequesttotheremoteWebDriverserverforURLhttp://localhost:xxxx/sessiontimedoutafter60seconds.”1.在谷歌浏览器上加上中括号中的内容[--remote-debugging-port=9222]2.使用管理员模式打开谷歌浏览器3.重新生成......
  • Day3_beast实现http server
    一、绑定和监听连接在1CServer.h中声明acceptor,以及用于事件循环的上下文iocontext,和构造函数classCServer:publicstd::enable_shared_from_this<CServer>{public:CServer(boost::asio::io_context&ioc,unsignedshort&port); //构造函数voidStart(); /......
  • json-server 快速搭建接口服务 使用教程
    json-server是一款小巧的接口模拟工具,一分钟内就能搭建一套Restful风格的API,尤其适合前端接口测试使用。只需指定一个json文件作为api的数据源即可,使用起来非常方便,30秒入门。进阶操作还支持分页,排序等操作,非常方便!开源地址主页地址:https://www.npmjs.com/package/js......
  • SQL SERVER 查数据库中锁的情况
    SELECTL.request_session_idASSessionID,DB_NAME(L.resource_database_id)ASDatabaseName,O.NameASLockedObjectName,P.object_idASObjectID,L.resource_typeASResourceType,L.request_modeASLockType,ST.textASSqlStatemen......