教你用Node.js与Express建立一个GraphQL服务器

目录
  • 前言
  • GraphQL服务器配置设置
  • 定义模式
  • 嘲弄我们的数据
  • 定义解析器
  • 定义突变
  • 总结

前言

在这篇文章中,我们将对使用Node.js和Express建立GraphQL服务器的整个过程进行演练。我们将使用 Express 的中间件库express-graphql 来协助我们完成这一过程。

如果你还不熟悉GraphQL以及我们使用它的目的,请务必查看篇文章,我们将深入了解GraphQL是什么以及为什么我们应该在我们的应用程序中使用它。

如果你已经熟悉它了,你可能想看看这篇文章,在这篇文章中我们用React实现了Apollo客户端来连接到我们现在要创建的服务器。

包含这篇文章中的代码的资源库可以在这里找到。

还有一个包含使用该服务器的前端的资源库,可以在这里找到。

所以,不用多说了,让我们开始吧。

GraphQL服务器配置设置

首先,我们可能想先创建一个新的目录,通过以下命令设置npm npm init命令,然后创建我们的 server.js文件,该文件将承载我们的GraphQL服务器。

一旦我们完成了这些,我们就需要安装以下库:

  • express
  • express-graphql
  • graphql
  • cors

server.js文件看起来应该是这样的:

const app = require("express")();
const cors = require('cors');
const { graphqlHTTP } = require("express-graphql");
const { buildSchema } = require("graphql");
const schema = buildSchema('');
const root = {
};
app.use(cors());
app.use(
  "/graphql",
  graphqlHTTP({
    schema,
    rootValue: root,
    graphiql: true,
  })
);
app.listen(8080, () => {
  console.log('GraphQL server running on port 8080');
});

让我们来看看配置过程的每一步,这样我们就能更好地了解实际发生的情况:

  • 首先导入express并调用其导出的主函数,这样我们就可以通过app变量来设置我们的应用服务器了
  • 导入cors库的主函数,以帮助我们解决在不同域(localhost与不同端口)上运行服务器的问题
  • Express-graphql库中导入graphqlHTTP方法,帮助我们进行配置
  • graphql库中导入buildSchema方法来定义数据模式(我们允许客户访问哪些数据)。
  • 现在定义一个空的数据模式
  • 现在定义一个空的根,但这将被用来定义我们的 调解器或者说我们选择如何处理数据,以便将其发送到客户端。
  • 设置 CORS,不需要额外的配置
  • 定义我们将用于**"/graphql "**端点的配置,它将利用我们之前定义的模式、根解析器对象,以及我们将用于测试和与我们的数据进行可视化交互的游乐场。

为了启动服务器,你所需要做的就是执行 node server.js命令。然后你可以在你的浏览器中检查 "localhost:8080",在那里你就可以看到GraphiQL游乐场的运行,这是一种与你的数据/架构进行交互的可视化方式。

它看起来应该是这样的。

在浏览器中运行的GraphiQL

定义模式

现在我们已经把GraphQL设置好了,让我们看看用一些数据来填充我们的GraphQL模式。

为了简单起见,我们将使用一些更基本的模型,并在这些模型之间定义一个基本关系。我们将有一个作者模型和一个图书模型,它们将有以下模式:

书籍模式:

作者模式

正如你从所附图片中看到的,我们将有2个基本模型,分别有3个和4个字段,在这里我们也定义了一对多的关系。这意味着一个作者可以写很多书,而一本书只能有一个作者。

这就是我们如何在代码中定义这些模型模式:

const schema = buildSchema(
  `
    type Query {
      authors: [Author]
      books: [Book]
    }

    type Author {
      id: String
      firstName: String!
      lastName: String!
      books: [Book]
    }

    type Book {
      id: String
      title: String!
      author: Author
    }
  `
);

我们还必须定义我们的父查询类型,它承载了所有检索数据的查询。在定义了父查询之后,我们将不得不为作者和书的模型定义模式。

你可以注意到一些字段类型后面的""符号,这表示一个字段是不可置空的。方括号("[]")围绕着一个类型,意味着它是一个数组。

嘲弄我们的数据

我们现在已经定义了模式,但还缺少两样东西:数据和解析器来解析查询的数据。

首先,让我们根据之前定义的模式来模拟我们的数据:

const mockedAuthors = [
  {
    id: '1',
    firstName: "Mike",
    lastName: "Ross",
  },
  {
    id: '2',
    firstName: "John",
    lastName: "Miles",
    books: [
      {
        id: '1',
        title: "Book 1",
        author: {
          id: '2',
          firstName: "John",
          lastName: "Miles",
        },
      },
      {
        id: '2',
        title: "Book 2",
        author: {
          id: '2',
          firstName: "John",
          lastName: "Miles",
        },
      },
    ],
  },
];

const mockedBooks = {
  '1': {
    title: "Book 1",
    author: mockedAuthors["2"],
  },
  '2': {
    title: "Book 2",
    author: mockedAuthors["2"],
  },
};

正如你可能注意到的,"Mike Ross "还没有写任何书,这不是一个问题,因为作者模式不需要在其数组内有任何书。此外,根本不需要定义一个书的数组,因为模式不需要它。然而,我们可以通过改变作者的书籍字段的类型来改变这种情况。[书籍]!这就要求至少有一个数组,不管是不是空的。

定义解析器

现在我们已经定义了模式和数据,我们可以通过定义解析器来完成,我们将使用这些解析器来实际处理如何将数据传递给客户端。

现在,我们只需要两个解析器:

  • 一个用于解析作者的数据
  • 一个用于解析图书数据

我们将在根中这样定义解析器:

const root = {
  authors: () => mockedAuthors,
  books: () => mockedBooks,
};

正如你在上面的代码片段中所看到的,定义解析器的过程是非常直接的。会有一个作为查询名称的属性,这意味着通过具体查询 "author",都是小写字母,你会得到 "mockedAuthors "数据。

注意,我们还将函数作为值传递给属性,这一点很关键。

现在让我们测试一下所有的东西,这样我们就可以确保它按预期工作:

正如你所看到的,这一切都像预期的那样工作正常。我们使用GraphQL的特定术语,提到我们正在做一个查询,使用 "query "关键字,后面是我们希望查询的属性/类型/条目。在这种情况下,我们希望查询作者类型的所有属性,但只查询书籍类型的id和标题;我们跳过了作者字段。

因为我们已经模拟了数据,以包括书籍中的作者,我们可能会做像这样的循环查询。

所以,你有了它。你可以看到设置GraphQL服务器并为其定义模式和解析器是多么容易。通过定义类型,你不仅有验证的地方,而且你还可能从你所选择的游乐场访问文档。

GraphiQL提供了一个右上方的小Docs菜单,它可以跳出来,向你展示在模式中定义的所有类型的文档。

GraphiQL中的GraphQL自我文档化模式

现在我们已经建立了使用查询检索数据的工作流程,我们还将看看如何使用突变来修改已有的数据。

定义突变

当我们使用查询来检索数据时,我们使用突变来创建、修改或删除现有数据。

假设我们要创建一个新的作者条目,我们要做的就是定义一个新的父 "突变"类型,该类型将拥有我们在整个系统中可能使用的突变字段。在那之后,我们必须为它定义解析器,然后就可以了。这将是我们需要做的所有事情。

下面的代码片段应该说明最终的server.js文件具有创建一个新的作者条目的能力:

const app = require("express")();
const cors = require('cors');
const { graphqlHTTP } = require("express-graphql");
const { buildSchema } = require("graphql");
const schema = buildSchema(
  `
    type Query {
      authors: [Author]
      books: [Book]
    }
    type Mutation {
      createAuthor(
        firstName: String!,
        lastName: String!
      ): Author
    }
    type Author {
      id: String
      firstName: String!
      lastName: String!
      books: [Book]
    }
    type Book {
      id: String
      title: String!
      author: Author
    }
  `
);
const mockedAuthors = [
  {
    id: '1',
    firstName: "Mike",
    lastName: "Ross",
  },
  {
    id: '2',
    firstName: "John",
    lastName: "Miles",
    books: [
      {
        id: '1',
        title: "Book 1",
        author: {
          id: '2',
          firstName: "John",
          lastName: "Miles",
        },
      },
      {
        id: '2',
        title: "Book 2",
        author: {
          id: '2',
          firstName: "John",
          lastName: "Miles",
        },
      },
    ],
  },
];
const mockedBooks = {
  '1': {
    title: "Book 1",
    author: mockedAuthors["2"],
  },
  '2': {
    title: "Book 2",
    author: mockedAuthors["2"],
  },
};
const root = {
  authors: () => mockedAuthors,
  books: () => mockedBooks,
  createAuthor: ({ firstName, lastName }) => {
    const id = String(mockedAuthors.length + 1);
    const createdAuthor = {
      id,
      firstName,
      lastName
    };
    mockedAuthors.push(createdAuthor);
    return createdAuthor;
  }
};
app.use(cors());
app.use(
  "/graphql",
  graphqlHTTP({
    schema,
    rootValue: root,
    graphiql: true,
  })
);
app.listen(8080);

所以,你有了它。你应该有一个工作的GraphQL服务器,你可以与之互动,以检索和修改或删除数据。

你可能会选择开始研究将解析器和模式类型分离到单独的目录和文件中,并在server.js文件中聚合它们,还有更多;在考虑扩展GraphQL应用程序时,选择是无穷无尽的。毕竟,这是它被建立的原因之一。

我希望你喜欢阅读这篇文章,并希望它能帮助你了解使用Node.js和Express设置GraphQL服务器的基本原理。

总结

到此这篇关于用Node.js与Express建立一个GraphQL服务器的文章就介绍到这了,更多相关Node.js和Express建立GraphQL服务器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Express与NodeJs创建服务器的两种方法

    目录 NodeJs创建Web服务器 Express创建Web服务器 NodeJs创建Web服务器 var http = require('http'); var server = http.createServer(function(req, res) { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.write('hello world!'); res.end(); }).listen(80); 这是一个原生式的创建一个we

  • node通过express搭建自己的服务器

    前言 为了模拟项目上线,我们就需要一个服务器去提供API给我们调用数据.这次我采用express框架去写API接口.所有请求都是通过ajax请求去请求服务器来返回数据.第一次用node写后端,基本就是摸着石头的过河,文中有什么不足不处欢迎指出. 安装express框架 传送门: express官方 然后介绍一下需要引入的中间件,node本身提供了一些库.我们可以直接通过require去引用,对于未提供的库,我们也可以通过手动npm去安装 var fs = require('fs'); 操作文件模

  • node.js的Express服务器基本使用教程

    前言 Express 是一个node.js Web框架,提供强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具.他可以让前端工程师做后端的事,与数据库交互,可以通过向模板传递参数来动态渲染 HTML 页面. 初学者使用express可以快速的搭建一个Web项目,express中已经集成了Web的http服务器创建.请求和文件管理以及Session的处理等功能,所以express是非常适合初学者的入门学习. 使用教程 安装前需系统配置Node.js环境,然后使用Npm安装Express

  • GraphQL入门总体创建教程

    目录 简介 简单示例 maven依赖 Schema 解析schema并关联对应的fetchers DataFetchers Default DataFetchers 总体创建过程 资料 简介 因为目前做的项目查询提供的接口都使用GraphQL替代典型的REST API,所以有必要去对它进行了解和源码的阅读.本篇主要大致了解下GraphQL. 一种用于API的查询语言,让你的请求数据不多不少.前端按需获取,后端动态返回(不需要的数据不会返回甚至不会查库),对比起典型的REST API将更加灵活,后

  • node+Express测试服务器性能

    1 测试环境 1.1 服务器硬件 待测试主机采用的是AWS 云服务器选择了两款测试 1.1.1 t2.micro t2.micro 性能突进性EC2,也就是AWS global免费套餐那款服务器,配置如下: t2.micro 性能突进性EC2,也就是AWS global免费套餐那款服务器,配置如下: 型号 vCPU ECU 内存 存储 网络性能 价格(小时) t2.micro 1 变量 1 仅限 EBS 低到中等 0.0945 单核1G,CPU性能为0.45ECU,性能突进时可以达到2ECU.网

  • 教你用Node.js与Express建立一个GraphQL服务器

    目录 前言 GraphQL服务器配置设置 定义模式 嘲弄我们的数据 定义解析器 定义突变 总结 前言 在这篇文章中,我们将对使用Node.js和Express建立GraphQL服务器的整个过程进行演练.我们将使用 Express 的中间件库express-graphql 来协助我们完成这一过程. 如果你还不熟悉GraphQL以及我们使用它的目的,请务必查看这篇文章,我们将深入了解GraphQL是什么以及为什么我们应该在我们的应用程序中使用它. 如果你已经熟悉它了,你可能想看看这篇文章,在这篇文章

  • Node.js和Express简单入门介绍

    仅仅入门如何用Node.js和Express搭建一个web服务器,没有说明太多概念性的东西. 一. Nodejs简介 ​ ==Node是JavaScript语言的服务器运行环境.== ​ 所谓"运行环境"有两层意思:首先,JavaScript语言通过Node在服务器运行,在这个意义上,Node有点像JavaScript虚拟机:其次,Node提供大量工具库,使得JavaScript语言与操作系统互动(比如读写文件.新建子进程),在这个意义上,Node又是JavaScript的工具库. ​

  • 零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门

    本文改自非鱼的<[翻译]前端开发人员入门指南,从零开始搭建Node.js, Express, Jade, Mongodb服务器>,之所以把Jade换成Ejs,是因为我觉得ejs更符合WEB编程人员的习惯,更确切说应该是更符合PHP.ASP程序员的使用习惯.好了,废话不多说,直接开始教程. 第1部分 – 15分钟安装 如果你真的是从零开始学,那就花点时间先把环境搭建起来吧.这不难,我用的是Win8,所以这看上去跟那些用Mac和Ubuntu或者其它*nix系统的教程有点区别,不过大致是一样的. 第

  • node.js使用express框架进行文件上传详解

    关于node.js使用express框架进行文件上传,主要来自于最近对Settings-Sync插件做的研究. 目前的研究算是取得的比较好的进展. Settings-Sync中通过快捷键上传文件,其实主要还是请求后端接口. 于是我便使用node.js模拟一个服务,这个服务其实就相当于github api(Settings-Sync实际请求的接口,比如token验证,gist存储创建等都是来自github 对应的api). 话不多说,直接代码贴起讲解: 1.创建一个node.js项目(这里我以ex

  • 基于node.js依赖express解析post请求四种数据格式

    node.js依赖express解析post请求四种数据格式 分别是这四种: www-form-urlencoded form-data application/json text/xml 1.www-form-urlencoded 这是http的post请求默认的数据格式,需要body-parser中间件的支持 服务器端的demo: var express = require('express'); var app = express(); var bodyParser = require('

  • Linux CentOS系统下安装node.js与express的方法

    前言 最近因为工作需要,要安装使用node.js与express,但在网上找了很多步骤,各种问题,所以还是自己总结下吧. 1.下载 wget --no-check-certificate https://nodejs.org/dist/v6.10.1/node-v6.10.1-linux-x64.tar.xz 2.解压 tar xvf node-v6.10.1-linux-x64.tar.xz 在bin文件夹中已经存在node以及npm,设置为全局. sudo ln -s /data/node-

  • node.js(express)中使用Jcrop进行图片剪切上传功能

    需求说明 简单来说就是要实现用户上传头像,并且要保存用户裁切后的部分作为用户头像. 第一步,选择图片: 第二步,在弹窗页面中展现并进行裁切: 第三步,点击"保存",上传服务器. 实现过程 说来有点坎坷,相当于做了2遍,走了弯路. 第1遍是用户一选择图片,就进行了上传,然后返回一个地址,所以在弹层上展现的图片已经是服务器上的图片了,然后进行裁切,再保存. 第2遍找到的一个方法,是在第1遍做到裁切处理时候想到的,即弹层展现的是用户机器上选择的图片,不用先上传,但是用image/base64

  • node.js基于express使用websocket的方法

    本文实例讲述了node.js基于express使用websocket的方法.分享给大家供大家参考,具体如下: 这个效果我也是翻了好长时间的资料,测试才成功的,反正成功,大家看看吧 首先你需要安装socket.io模块 npm install socket.io --save 然后打开express的app.js将模块引入,在12行左右的 var app = express(); 下面添加两行 var server = require('http').Server(app); var io = r

  • Node.js使用Express.Router的方法

    在实际开发中通常有几十甚至上百的路由,都写在 index.js 既臃肿又不好维护,这时可以使用 express.Router 实现更优雅的路由解决方案. 目录结构如下: routes的index.js代码如下: const express = require('express') const router = express.Router() router.get('/', function (req, res) { res.send('hello, express') }) module.ex

  • node.js中express模块创建服务器和http模块客户端发请求

    首先下载express模块,命令行输入 npm install express 1.node.js中express模块创建服务端 在js代码同文件位置新建一个文件夹(www_root),里面存放网页文件等,就可以在浏览器中访问了 var express = require("express"); var path = require("path"); var app = express(); //目录 (当前目录下的www_root目录) app.use(expre

随机推荐