使用Node.js和Express入门GraphQL

总结

本文记录了第一次尝试实现GraphQL的步骤,以及示例源代码。

环境

    • macOS Big Sur 11.1

 

    • node v14.12.0

 

    • yarn 1.22.10

 

    • express 4.16.1

 

    • Docker version 19.03.13

 

    docker-compose version 1.27.4

样本源代码。 .)

hayatoiwashita/express-graphql的中文意思是什么?

操作步骤

1. 创建项目的草稿

使用express-generator。
–git选项用于添加.gitignore文件的选项。

$ express --view=pug --git express-graphql

请参考Express的应用程序生成程序。

2. 安装图书馆

只需要以下最低限度的GraphQL相关库就可以了。

$ yarn add graphql
$ yarn add express-graphql

在样例中,还添加了以下内容(省略以免偏离主题)。

# ホットリロード
$ yarn add --dev nodemon
# コード整形
$ yarn add prettier --dev --exact
$ yarn add eslint --dev
$ yarn add --dev eslint-config-prettier
$ yarn add --dev eslint-plugin-prettier
# commit時にコード整形を実行
$ yarn add --dev lint-staged
$ yarn add --dev husky

3. 准备样本数据

我加入了/data/users.js文件,用它代替了数据库。
(具体内容请参考示例源代码中的users.js文件)

4. 定义schema

创建/schema/schema.graphql并定义架构。
仅实现了参考查询。
数据结构是用户及其关联的发布等形式。

const { buildSchema } = require("graphql");

const schema = buildSchema(`
    type Query {
        users: [User!]!,
        user(id: Int!): User!
    }

    type User {
        id: ID!
        name: String!
        email: String
        posts: [Post!]
    }

    type Post {
        id: ID!
        title: String!
        published: Boolean!
        link: String
        author: User!
    }
`);

module.exports = schema;

创建解析器。

创建/src/resolvers.js来进行数据操作。
如前所述,本次只涉及查询操作。

const { Users } = require('../data/users');

const resolvers = {
  users: async (_) => {
    console.log('come here');
    return Users;
  },
  user: async ({ id }, context) => {
    return Users.find((user) => user.id == id);
  },
};

module.exports = resolvers;

6. 修改app.js文件

定义了一个端点/graphql。

// var createError = require('http-errors');
var express = require('express');
var { graphqlHTTP } = require('express-graphql');
var resolvers = require('./src/resolvers');
var schema = require('./schema/schema.graphql');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

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

module.exports = app;

7. [参考] 容器化

添加Dockerfile和docker-compose.yml。

FROM node:14.15.4-slim

WORKDIR /usr/local/src/express-graphql
ADD . .
RUN yarn install
CMD [ "yarn", "start" ]
version: '3'

services:
  graphql:
    build: .
    container_name: graphql-container
    ports:
      - "3000:3000"

8. 启动Express

执行启动命令。

# コンテナで実行
$ docker-compose up

# コンテナを使用せず実行
$ yarn start

9. 运行查询

screencapture-localhost-3000-graphql-2021-01-16-16_08_50.png

【样例查询】
目标是获取用户ID=1的用户的姓名以及该用户的帖子(post)的ID和标题。

{
  user(id:1) {
    name
    posts {
      id
      title
    }
  }
}

执行结果

{
  "data": {
    "user": {
      "name": "Fikayo Adepoju",
      "posts": [
        {
          "id": "1",
          "title": "Debugging an Ionic Android App Using Chrome Dev Tools"
        },
        {
          "id": "2",
          "title": "Hosting a Laravel Application on Azure Web App"
        }
      ]
    }
  }
}
screencapture-localhost-3000-graphql-2021-01-17-15_09_38.png

请参考

    GraphQLをNode.jsとexpressでためしてみる
广告
将在 10 秒后关闭
bannerAds