GraphQL 是一个强大的查询语言和运行时环境,它可以帮助前端开发人员更好地管理和组织 API。构建一个 GraphQL API 的过程中,一个清晰、有层次结构的项目结构非常关键。在本文中,我们将介绍一个建议的 GraphQL 项目结构,并提供了示例代码。
项目结构
我们认为,一个好的 GraphQL 项目应该具备以下目录结构:
├── src │ ├── graphql │ ├── models │ ├── resolvers │ └── typeDefs ├── index.js └── package.json
接下来,我们会详细讲解每一个目录的作用。
graphql 目录
该目录用于存储 GraphQL 的对外接口。在这个目录中,我们需要创建一个公共的 GraphQL Schema。GraphQL Schema 用于定义 API 的数据类型以及数据查询的规则。虽然 GraphQL Schema 的定义可以分布在不同的文件中,但是我们建议将所有的 Schema 集中在一个文件中,以方便管理。一般来说,文件名为 schema.js。
// javascriptcn.com 代码示例 const { gql } = require('apollo-server-express'); const typeDefs = gql` type Query { helloWorld: String! books: [Book!]! authors: [Author!]! } type Book { id: ID! title: String! author: Author! } type Author { id: ID! name: String! books: [Book!] } `; module.exports = typeDefs;
models 目录
该目录用于存储应用程序中的数据模型,这些数据模型可以用于定义数据类型以及对这些类型进行 CRUD 操作。对于 GraphQL 项目来说,数据模型通常是由 ORM (例如 Sequelize 或 Mongoose)生成的。除了数据模型之外,我们也可以将相关的数据库文档也保存在这个目录中。
resolvers 目录
该目录用于存储 GraphQL 的数据解析器。数据解析器是用于定义具体的数据查询逻辑,这些逻辑通常是由后端数据模型或 API 提供的数据。在 resolvers 目录中,我们需要创建解析器,以将模型中的数据映射到针对特定查询的响应。例如,如果我们要查询书籍数据,则需要从数据库中获取相关的数据并提供响应。
// javascriptcn.com 代码示例 const resolvers = { Query: { helloWorld: () => { return "Hello World"; }, books: async () => { return await Book.findAll({ include: [Author] }); }, authors: async () => { return await Author.findAll({ include: [Book] }); } }, Book: { author: async (book) => { return await Author.findByPk(book.authorId); } }, Author: { books: async (author) => { return await Book.findAll({ where: { authorId: author.id } }); } } }; module.exports = resolvers;
typeDefs 目录
该目录用于存储 GraphQL Schema 定义。Schema 定义描述了可操作数据的类型以及可执行的查询和变更。在 typeDefs 目录下,我们提供了 GraphQL Schema 的相关文件类型,包括 Book 类型和 Author 类型(由 Query 类型组成)。
// javascriptcn.com 代码示例 const { gql } = require('apollo-server-express'); const typeDefs = gql` type Query { helloWorld: String! books: [Book!]! authors: [Author!]! } type Book { id: ID! title: String! author: Author! } type Author { id: ID! name: String! books: [Book!] } `; module.exports = typeDefs;
示例代码
下面是我们使用上述目录结构组织的一个 GraphQL API 的示例代码:
// javascriptcn.com 代码示例 const express = require('express'); const { ApolloServer } = require('apollo-server-express'); const typeDefs = require('./src/typeDefs'); const resolvers = require('./src/resolvers'); const db = require('./models'); const app = express(); const server = new ApolloServer({ typeDefs, resolvers }); server.applyMiddleware({ app }); const { PORT = 4000 } = process.env; db.sequelize.sync().then(() => { app.listen(PORT, () => console.log(`Server is running at http://localhost:${PORT}${server.graphqlPath}`) ); });
总结
在这篇文章中,我们介绍了一个 GraphQL API 项目的一个常见的目录结构,并提供了一些示例代码。使用这个推荐的目录结构,我们可以轻松地组织和管理一个 GraphQL 项目,以便更方便地添加,维护和扩展 API 功能。我们建议你对这个结构进行修改,以适应你的具体需求,并在实践中使用它来构建更好的 GraphQL API。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6539626f7d4982a6eb2af94f