使用GraphQL Yoga构建可扩展的GraphQL后端

柠檬微凉 2020-02-17 ⋅ 16 阅读

GraphQL是一种用于API的查询语言和运行时的类型系统,它使得客户端能够准确地获取他们需要的数据而不需要过多的请求。GraphQL Yoga是一个构建可扩展的GraphQL后端的高级库,它结合了Prisma,Express和Apollo Server等开源项目,为我们提供了一个强大和灵活的开发工具。

安装GraphQL Yoga

首先,我们需要安装GraphQL Yoga。你可以使用npm或yarn进行安装。

npm install graphql-yoga

或者

yarn add graphql-yoga

创建GraphQL服务器

接下来,我们将创建一个GraphQL服务器。在项目根目录下创建一个index.js文件,并添加以下代码:

const { GraphQLServer } = require('graphql-yoga');

const typeDefs = `
  type Query {
    hello: String!
  }
`;

const resolvers = {
  Query: {
    hello: () => 'Hello, World!'
  }
};

const server = new GraphQLServer({ typeDefs, resolvers });

server.start(() => console.log('Server is running on localhost:4000'));

在上面的代码中,我们定义了一个简单的查询类型和相应的解析器函数。查询类型包括一个hello字段,返回一个字符串。解析器函数简单地返回了一个"Hello, World!"的字符串作为响应。

运行GraphQL服务器

要启动GraphQL服务器,我们可以在终端中运行以下命令:

node index.js

或者,如果你使用的是nodemon:

nodemon index.js

现在,你可以访问http://localhost:4000并在GraphQL Playground中测试我们的服务器。

扩展GraphQL服务器

GraphQL Yoga提供了很多额外的功能和配置选项,使得构建可扩展的GraphQL后端变得更加容易。

添加数据模型

要添加数据模型并与GraphQL服务器集成,你可以使用Prisma。Prisma是一个现代化的数据库工具,可以帮助我们轻松地管理数据库和生成有关数据模型的类型定义。

首先,安装Prisma CLI。在终端中运行以下命令:

npm install -g prisma

或者

yarn global add prisma

然后,使用以下命令在项目根目录中初始化Prisma:

prisma init

按照提示进行操作,选择Demo server选项(如果你没有本地数据库)。

完成初始化后,你可以定义数据模型。在prisma目录中创建一个datamodel.graphql文件,并添加以下代码:

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

type Post {
  id: ID! @id
  title: String!
  body: String!
  published: Boolean!
  author: User!
}

然后,使用以下命令将数据模型部署到Prisma服务器:

prisma deploy

这将自动创建一个GraphQL服务器和相应的Prisma客户端。

使用数据库查询和突变

一旦数据模型部署成功,我们就可以在GraphQL服务器中使用数据库查询和突变了。

index.js文件中添加以下代码:

const { Prisma } = require('prisma-binding');

const resolvers = {
  Query: {
    users: (_, args, ctx, info) => {
      return ctx.db.query.users({}, info);
    },
    posts: (_, args, ctx, info) => {
      return ctx.db.query.posts({}, info);
    },
    ...
  },
  Mutation: {
    createUser: (_, { name, email }, ctx, info) => {
      return ctx.db.mutation.createUser(
        {
          data: {
            name,
            email
          }
        },
        info
      );
    },
    createPost: (_, { title, body, published, authorId }, ctx, info) => {
      return ctx.db.mutation.createPost(
        {
          data: {
            title,
            body,
            published,
            author: {
              connect: { id: authorId }
            }
          }
        },
        info
      );
    },
    ...
  }
};

const server = new GraphQLServer({
  typeDefs: './src/schema.graphql',
  resolvers,
  context: req => ({
    ...req,
    db: new Prisma({
      typeDefs: 'src/generated/prisma.graphql',
      endpoint: 'https://eu1.prisma.sh/YOUR-USERNAME/YOUR-PRISMA-SERVICE/YOUR-PRISMA-ENDPOINT',
      debug: true
    })
  })
});

在上面的代码中,我们首先导入prisma-binding模块,并在解析器函数中使用Prisma客户端来执行数据库查询和突变操作。

我们还将Prisma客户端添加到GraphQL服务器的上下文中,以使其在所有解析器函数中都可用。

构建自定义解析器函数

有时,我们可能需要构建自定义的解析器函数来处理特定的逻辑。我们可以通过将解析器函数添加到resolvers对象中来实现这一点。

const resolvers = {
  ...
  User: {
    posts: (parent, args, ctx, info) => {
      return ctx.db.query.posts(
        {
          where: {
            author: { id: parent.id }
          }
        },
        info
      );
    }
  },
  ...
};

在上面的代码中,我们为User类型添加了一个自定义的解析器函数(字段Level解析器)。这个解析器函数可以帮助我们获取一个用户所发布的所有文章。

使用中间件

GraphQL Yoga还提供了中间件功能,用于处理和修改HTTP请求和响应。这是一个强大的工具,可以帮助我们添加身份验证、错误处理和性能监控等功能。

要添加中间件,我们可以使用server.use()方法。例如,我们可以添加一个简单的日志中间件:

server.use((req, res, next) => {
  console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
  next();
});

在上面的代码中,我们添加了一个简单的日志中间件,每次请求时都会打印请求方法和URL。

结论

GraphQL Yoga是一个功能强大的库,它使得构建可扩展的GraphQL后端变得更加容易。通过结合Prisma和其他开源项目,我们可以快速构建出一个强大和灵活的GraphQL服务器,并使用它来处理复杂的数据操作。

希望本篇博客对你有所帮助,并鼓励你进一步探索GraphQL Yoga的功能和配置选项。祝你在构建GraphQL后端时有一个美好的旅程!


全部评论: 0

    我有话说: