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后端时有一个美好的旅程!
本文来自极简博客,作者:柠檬微凉,转载请注明原文链接:使用GraphQL Yoga构建可扩展的GraphQL后端