GraphQL + MySQL:构建高效查询服务

GraphQL 是一种由 Facebook 开发的数据查询语言,其主要特点是能够在客户端自定义请求数据,避免了传统 RESTful API 中出现的“过度获取”或“过度请求”的问题。而 MySQL 是一种流行的关系型数据库,其稳定性和可扩展性得到了广泛认可。本文将介绍如何将 GraphQL 和 MySQL 结合起来,构建高效的查询服务。

环境配置

首先,需要安装 MySQL 数据库,并创建一个名为 graphql 的数据库。接着,需要在该数据库中创建一个名为 users 的表,其中包含以下字段:

  • id:整数类型,主键
  • name:字符串类型,用户姓名
  • age:整数类型,用户年龄
  • email:字符串类型,用户邮箱
  • createdAt:日期类型,用户创建时间

接下来,需要安装 Node.js 和 npm,然后使用 npm 安装以下依赖项:

  • express:用于创建 HTTP 服务器
  • express-graphql:用于创建 GraphQL 服务器
  • graphql:GraphQL 的 JavaScript 实现
  • mysql2:MySQL 的 Node.js 驱动程序

编写 GraphQL Schema

在创建 GraphQL 服务器之前,需要编写 GraphQL Schema,它定义了可用的查询和数据类型。在本例中,我们将定义一个名为 User 的数据类型,它包含了 idnameageemailcreatedAt 字段。我们还将定义一个名为 Query 的根查询类型,它包含了一个 users 查询,用于检索所有用户。

type User {
  id: ID
  name: String
  age: Int
  email: String
  createdAt: String
}

type Query {
  users: [User]
}

编写 GraphQL Resolver

接下来,需要编写 GraphQL Resolver,它负责处理查询请求并返回相应的数据。在本例中,我们将使用 MySQL 查询数据库,并将查询结果转换为 GraphQL 数据类型。以下是 users 查询的 Resolver 示例:

const mysql = require('mysql2/promise');

const connection = await mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'graphql'
});

const resolvers = {
  Query: {
    users: async () => {
      const [rows] = await connection.query('SELECT * FROM users');
      return rows.map(row => ({ ...row, createdAt: row.createdAt.toISOString() }));
    }
  }
};

在上面的代码中,我们使用 mysql2 创建了一个 MySQL 连接,并在 users 查询中执行了一个简单的 SELECT 语句。我们还将查询结果中的 createdAt 字段转换为 ISO 字符串格式,以便 GraphQL 可以正确解析它。

创建 GraphQL 服务器

最后,我们需要使用 express-graphql 创建一个 GraphQL 服务器,并将前面定义的 Schema 和 Resolver 传递给它。以下是完整的代码示例:

const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { buildSchema } = require('graphql');
const mysql = require('mysql2/promise');

const connection = await mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'graphql'
});

const schema = buildSchema(`
  type User {
    id: ID
    name: String
    age: Int
    email: String
    createdAt: String
  }

  type Query {
    users: [User]
  }
`);

const resolvers = {
  Query: {
    users: async () => {
      const [rows] = await connection.query('SELECT * FROM users');
      return rows.map(row => ({ ...row, createdAt: row.createdAt.toISOString() }));
    }
  }
};

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

app.listen(3000, () => {
  console.log('GraphQL server running at http://localhost:3000/graphql');
});

在上面的代码中,我们首先创建了一个 MySQL 连接,并使用 buildSchema 构建了 GraphQL Schema。接着,我们编写了 Resolver,并将 Schema 和 Resolver 传递给 graphqlHTTP 函数,创建了一个 GraphQL 服务器。最后,我们使用 express 创建了一个 HTTP 服务器,并将 GraphQL 服务器挂载到其上。

使用 GraphQL 查询数据

现在,我们可以使用 GraphQL 查询语言查询数据了。打开浏览器,访问 http://localhost:3000/graphql,可以看到 GraphQL Playground。在左侧的查询编辑器中输入以下查询语句:

query {
  users {
    id
    name
    age
    email
    createdAt
  }
}

点击运行按钮,就可以看到查询结果了。以下是示例查询结果:

{
  "data": {
    "users": [
      {
        "id": 1,
        "name": "Alice",
        "age": 20,
        "email": "alice@example.com",
        "createdAt": "2022-01-01T00:00:00.000Z"
      },
      {
        "id": 2,
        "name": "Bob",
        "age": 30,
        "email": "bob@example.com",
        "createdAt": "2022-01-02T00:00:00.000Z"
      },
      {
        "id": 3,
        "name": "Charlie",
        "age": 40,
        "email": "charlie@example.com",
        "createdAt": "2022-01-03T00:00:00.000Z"
      }
    ]
  }
}

总结

本文介绍了如何将 GraphQL 和 MySQL 结合起来,构建高效的查询服务。通过编写 Schema 和 Resolver,创建 GraphQL 服务器,并使用 GraphQL 查询语言查询数据,我们可以轻松地实现客户端自定义请求数据的功能,避免了传统 RESTful API 中出现的“过度获取”或“过度请求”的问题。如果您对 GraphQL 和 MySQL 感兴趣,可以继续深入了解它们的更多特性和用法。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65897d11eb4cecbf2ded11d3


纠错
反馈