使用 Express 设置 GraphQL

news2024/11/17 7:42:41

使用 Express 设置 GraphQL

在本文中,我们将探讨如何在 Node.js 中设置 Express.jsGraphQL。另外,本文还将分享一些基本技巧,以确保我们的服务器已准备好投入实际使用!

什么是 GraphQL

GraphQLAPI 的查询语言,它提供了一种更灵活的方式来获取所需的数据。使用 GraphQL,我们不必拥有用于不同目的的多个端点,而是可以使用单个端点来根据您提供的查询提供不同的数据。

今天,我们就来看看如何通过使用 Express 来设置 GraphQL

项目初始化

创建一个名为node-demo的新文件夹,在控制台上打开该文件夹并输入:

npm init

所需的依赖

  • @graphql-tools/load-files:这个工具帮助我们从项目中加载模式文件。
  • @graphql-tools/schema:对于合并和创建 GraphQL 模式很有用。
  • cors:提供中间件以在我们的 Express 应用程序中启用跨源资源共享(CORS)。
  • dotenv:帮助将环境变量从.env文件加载到process.env.
  • expressNode.jsWeb 服务器框架。它是我们应用程序的支柱。
  • express-graphql:将 GraphQLExpress 集成的中间件。
  • graphql:使用JavaScript 实现的GraphQL核心包。
  • graphql-tools:提供一组用于在 JavaScript 中构建 GraphQL API 的实用程序。

安装依赖

首先,让我们使用 yarn 安装这些包:

yarn add @graphql-tools/load-files @graphql-tools/schema cors dotenv express express-graphql graphql graphql-tools

安装好后,项目中的package.json应该如下所示:


{
  "name": "node-demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@graphql-tools/load-files": "^6.6.1",
    "@graphql-tools/schema": "^10.0.0",
    "cors": "^2.8.5",
    "dotenv": "^16.3.1",
    "express": "^4.18.2",
    "express-graphql": "^0.12.0",
    "graphql": "^15.8.0",
    "graphql-tools": "^7.0.5"
  }
}

入口文件编写

// index.js
const http = require('http');
const app = require('./app.js');
require('dotenv').config();

const PORT = process.env.PORT || 8000;

const httpServer = http.createServer(app);

async function startServer() {

  httpServer.listen(PORT, () => { 
    console.log(' server is live on ', PORT);
  });
}

startServer();
  • 我们引入http模块并用它初始化一个 Node.js 服务器。
  • 我们正在从app.js文件中加载我们的 Express 服务器配置。我们稍后将讨论该文件的细节。
  • 激活dotenv,它将从一个名为 .env 的特殊文件中读取一些环境变量。

在继续之前,请在项目根目录中创建一个.env文件。可以在此处放置数据库连接详细信息、密钥等信息。

设置express服务

// app.js
const cors = require("cors");
const express = require("express");
const { graphqlHTTP } = require('express-graphql');

const Api1 = require("./routes/api.js");
const graphqlServer = require("./graphql/index.js");

const app = express();

app.use(
  '/graphql',
  graphqlHTTP({
    schema: graphqlServer,
    graphiql: true,
  })
)

app.use(
  cors()
);

app.use(express.json());

app.use("/v1", Api1);

module.exports = app;

app.js 文件中,我们正在为我们的服务器奠定基础:

  • 引入./routes/api.js文件,定义路由。
  • 发起cors跨源请求、构建我们的服务器并将express-graphqlexpress集成 GraphQL
  • 安装 GraphQL, 设置并启用graphiql来更简单的实现 GraphQL 查询。
  • 配置 CORS 并设置中间件来解析传入的 JSON 请求。
  • 最后导出Express 服务器。

注意:确保项目根目录中有routesgraphiql文件夹。它们将分别容纳我们的 Express 路由和 GraphQL 架构。

构建 GraphQL 架构

// graphql/index.js
const path = require("path");

const { loadFilesSync } = require("@graphql-tools/load-files");
const { makeExecutableSchema } = require("@graphql-tools/schema");

const typeDefs = loadFilesSync(path.join(__dirname, "**/*.graphql"));
const resolvers = loadFilesSync(path.join(__dirname,"**/*.resolver.js"))

const executableSchema = makeExecutableSchema({
  typeDefs,
  resolvers,
});

module.exports = executableSchema;

导入必要的模块

// graphql/index.js
const { loadFilesSync } = require("@graphql-tools/load-files");
const { makeExecutableSchema } = require("@graphql-tools/schema");
  • @graphql-tools/load-files模块中引入loadFilesSync函数。它是加载多个文件的助手。
  • @graphql-tools/schema模块中引入makeExecutableSchema,它将帮助我们结合类型定义和解析器来创建 GraphQL 模式。

加载 GraphQL 类型定义

// graphql/index.js
const typeDefs = loadFilesSync(path.join(__dirname, "**/*.graphql"));

在这里,我们从当前目录及其子目录中加载所有后缀为.graphql的文件。这些文件描述了我们数据的“形状”以及我们可以对其执行的操作。

加载解析器并创建可执行架构

// graphql/index.js
const resolvers = loadFilesSync(path.join(__dirname,"**/*.resolver.js"))

const executableSchema = makeExecutableSchema({
  typeDefs,
  resolvers,
});

从当前目录及其子目录加载所有后缀为.resolve.js文件,这些文件是提供处理 GraphQL 操作逻辑的函数,例如获取数据或进行更改。

设置基本 GraphQL 架构和解析器

// graphql/hello/hello.graphql
type Query {
    hello: String!
}
// graphql/hello/hello.resolver.js
const resolvers = {
    Query: {
        hello: () => "Hello, World!"
    }
};

我们创建了以.graphql.resolver.js结尾的文件。此设置的优点在于我i们不需要跟踪每个新文件或手动导入它们。@graphql-tools/load-files中的loadFilesSync方法会自动替我们完成。

在express.js中创建基本的hello路由

// routes/api.js
const { Router } = require('express');
const Api1 = Router();

const helloRouter = require('./hello/hello.router.js');

Api1.use('/hello', helloRouter);

module.exports = Api1;
// routes/hello/hello.router.js
const { Router } = require("express");
const helloRouter = Router();

const helloController = require("./hello.controller.js");

helloRouter.get("/", helloController.sayHello);

module.exports = helloRouter;
// routes/hello/hello.controller.js
async function sayHello(request, response) {
  response.status(200).json("hello from the express graphql server");
  return
}

module.exports = {
  sayHello,
};

在这些文件中,我们按照 MVC 模式设置基本的 Express.js 服务。

结果

通过我们之前的设置,我们的服务器现已完成并准备好处理传入请求。要启动并运行它,只需在终端中输入node index.js即可。在服务启动之后我们可以:

  • 通过 http://localhost:8000/graphql 访问 GraphQL
    在这里插入图片描述
  • 通过指定的 URL 访问 Express服务在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1047465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络爬虫——urllib(1)

前言🍭 ❤️❤️❤️网络爬虫专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ 前篇简单介绍了什么是网络爬虫及相关概念,这篇开始讲解爬虫中的第一个库——urllib。 urllib🍭 …

Windows安装CMake详细教程(附学习资料)

CMake是一个跨平台的开源构建工具,用于自动化管理C项目的构建过程。本教程旨在向初学者介绍如何在Windows操作系统上安装CMake,并提供详细的步骤指导,帮助您顺利开始使用这个强大的工具。 学习资料在文末~ 步骤1:下载CMake安装程…

SW利用点光源来校核

先要建立坐标系,然后查这个坐标系的绝对坐标 然后删除其他光源,把环境光源降低最小 最后添加点光源,位置在之前查的坐标点

在Windbg中设置断点追踪打开软件远程调试开关的模块

目录 1、Windbg动态调试 2、在Windbg中设置断点 2.1、在函数入口处设置断点 2.2、在函数内部某一行上设置断点 3、设置断点跟踪对打开远程调试开关接口的调用 3.1、编写演示代码 3.2、在Windbg中设置调用SetRemoteDebugOn接口的断点进行跟踪 4、最后 VC常用功能开发汇总…

线上Vue项目访问其他服务器接口(宝塔平台配置解决)

前端本地解决跨域问题非常简单,配置代理即可,线上需要配置nginx,宝塔给我们更简单的配置方式:反向代理。 登录进宝塔页面,选择网站,点击网站名,选择反向代理 点击添加反向代理 注意&#xff…

基于Springboot实现餐厅点餐系统演示【项目源码+论文说明】分享

基于Springboot实现餐厅点餐系统演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识&#xff…

resources(static与templates)

static "static"目录用于存放静态资源文件,例如HTML、CSS、JavaScript、图像等。 springboot整合了springmvc的拦截功能。拦截了所有的请求。默认放行的资源是:resources/static/ 目录下所有静态资源。(不走controller控制器就能…

【开发篇】十一、SpringBoot缓存底层实现技术的切换为Ehcache、Redis、Memcached

文章目录 0、补充:数据淘汰策略1、切换为Ehcache2、切换为Redis3、切换为memcached--安装与启停4、切换为memcached--整合 SpringBoot提供了缓存的统一整合接口,方便缓存技术的开发与管理: GenericJCacheEhcacheHazelcastInfinispanCouchbase…

《视觉 SLAM 十四讲》V2 ——第3讲

关于本笔记的说明: 最好跟着 原书 整理个人笔记,他人笔记仅适合参考部分内容。 ———————— B站链接 高翔博客链接 百度网盘链接:https://pan.baidu.com/s/1VsrueNrdqmzTvh-IlFBr9Q 提取码:vfhe github源码链接V2 《视觉…

OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列

OpenCV读取RGB图像 在OpenCV中,读取的图片默认是HWC格式,即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C,因此最小颗粒度是C。 例如,一张形状为2562563的RGB图像,在OpenCV中读取后的格式…

阿里云服务器方升架构、自研硬件、AliFlash技术创新

阿里云服务器技术创新:服务器方升架构及自研硬件、自研存储硬件AliFlash和阿里云异构计算加速平台,阿里云百科分享阿里云服务器有哪些技术创新: 目录 服务器技术创新 服务器方升架构及自研硬件 自研存储硬件AliFlash 阿里云异构计算加速…

进入k8s下mysql docker容器,设置慢查询开关

服务器账号信息:wps/kingsoft 进入mysql容器: kc exec -ti -n kube-public mysql-0 -- bash 访问数据库: mysql -h10.13.83.171 -uhuangweiheng -phuangweiheng_password; 数据库超管:root/wpsepmysql sudo service mysql r…

QQ农场怀旧版搭建(附带搭建完成示例)

QQ农场搭建 示例均在宝塔面板搭建搭建完成网站,欢迎━(`∀)ノ亻!大家种种菜 http://farm.dreamlove.top/如果不出意外应该会一直续费下去,毕竟linux服务器便宜很多~ 所需依赖 mysql 5.5 php 5.4 nginx 1.22下载农场文件并安装好了依赖 下载地址1:https://cloudr…

Cloudera Manager-6.2.0安装文档

环境准备 安装包地址 链接:https://pan.baidu.com/s/1QrLsXynmopqoZhDkoIAihg 提取码:kaoi 虚拟机建议配置 至少3台节点,server节点安装cloudera server服务和mysql服务 server节点 ​ 内存:3GB以上 ​ 存储:4…

react 网页/app复制分享链接到剪切板,分享到国外各大社交平台,通过WhatsApp方式分享以及SMS短信方式分享链接内容

1.需求 最近在做一个国际网站app,需要把app中某个页面的图文链接分享到国外各大社交平台上(facebook,whatapp,telegram,twitter等),以及通过WhatApp聊天方式分享,和SMS短信方式分享链接内容,该怎么做呢?图示如下: 分享到国外各大社交平台&am…

详解Avast Driver Updater:电脑驱动更新工具的利器还是多余的软件?

亲爱的读者朋友们,你是不是经常为电脑的驱动问题而烦恼?如果是的话,你可能会对这款软件——Avast Driver Updater 电脑驱动更新工具感兴趣。但在你决定尝试之前,不妨先和我一起深入探讨一下它的优点、缺点以及它适用的使用场景。 …

移动机器人建模两轮驱动与四轮驱动

本文章仅记录小编再学习过程中的知识总结,若有不对之处请批评指正,互相学习,共同进步。 一、两轮驱动运动学模型 示例最后得出,该机器人会沿全局参考系的Y轴以速度1的旋转的同时,以速度3瞬时的移动。 二、四轮驱动运动…

Ps:抓手工具

抓手工具 Hand Tool常用于在文档窗口中平移图像,方便观察大尺寸图像(或者被放大的图像)的局部细节,是操作 Ps 最常用的辅助工具之一。 快捷键:H ◆ ◆ ◆ 常用操作方法与技巧 1、快捷键 H 是一个弹簧键。即&#xff…

【Linux】 df命令使用

df命令 df 命令,用于显示 Linux 系统中各文件系统的硬盘使用情况,包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量等 执行命令结果 各列信息的含义分别是: Filesystem:表示该文件系统位于哪个分区,因此该…

算法与数据结构-AC自动机

文章目录 什么是多模式串匹配算法基于单模式串和 Trie 树实现的敏感词过滤经典的多模式串匹配算法:AC 自动机 什么是多模式串匹配算法 单模式串匹配算法,是在一个模式串和一个主串之间进行匹配,也就是说,在一个主串中查找一个模式…