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
的数据类型,它包含了 id
、name
、age
、email
和 createdAt
字段。我们还将定义一个名为 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