GraphQL 是一种由 Facebook 开发的查询语言,它可以帮助前端开发者更高效地进行数据查询和获取。在 Hapi 中使用 GraphQL 可以让我们更加方便地查询后端数据,本文将介绍如何在 Hapi 中使用 GraphQL 进行数据查询。
安装 GraphQL
首先,我们需要安装 GraphQL。使用 npm 安装即可:
npm install graphql
创建 GraphQL Schema
接下来,我们需要创建一个 GraphQL Schema。Schema 是 GraphQL 中的一个重要概念,它描述了我们的数据结构和查询方式。在 Hapi 中,我们可以使用 graphql-tools
库来创建 Schema:
const { makeExecutableSchema } = require('graphql-tools'); const typeDefs = ` type Query { hello: String } `; const resolvers = { Query: { hello: () => 'Hello world!' } }; const schema = makeExecutableSchema({ typeDefs, resolvers });
以上代码创建了一个简单的 Schema,其中包含了一个 Query
类型和一个 hello
字段。
集成到 Hapi 中
现在我们已经创建了一个 GraphQL Schema,接下来我们需要将它集成到 Hapi 中。
首先,我们需要安装 graphql-hapi
和 graphiql
两个库:
npm install graphql-hapi graphiql
然后在 Hapi 中注册 GraphQL 插件:
const Hapi = require('hapi'); const { graphqlHapi, graphiqlHapi } = require('graphql-hapi'); const { makeExecutableSchema } = require('graphql-tools'); const typeDefs = ` type Query { hello: String } `; const resolvers = { Query: { hello: () => 'Hello world!' } }; const schema = makeExecutableSchema({ typeDefs, resolvers }); const server = new Hapi.Server(); server.connection({ port: 3000 }); server.register([ { register: graphqlHapi, options: { path: '/graphql', graphqlOptions: { schema }, route: { cors: true } } }, { register: graphiqlHapi, options: { path: '/graphiql', graphiqlOptions: { endpointURL: '/graphql' } } } ], (err) => { if (err) { throw err; } server.start((err) => { if (err) { throw err; } console.log(`Server running at: ${server.info.uri}`); }); });
以上代码创建了一个 Hapi 服务器,并注册了 graphqlHapi
和 graphiqlHapi
两个插件。其中 graphqlHapi
插件用于处理 GraphQL 查询,graphiqlHapi
插件用于提供一个 GraphQL 的 Web 界面。
现在我们可以访问 http://localhost:3000/graphiql
来打开 GraphQL Web 界面,并进行查询。
查询数据
下面我们来看一个更加复杂的例子,如何查询一个数据库中的数据。
首先,我们需要安装 sequelize
和 pg
两个库:
npm install sequelize pg
然后我们创建一个 User
模型,用于表示一个用户:
const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'postgres' }); const User = sequelize.define('user', { name: { type: Sequelize.STRING }, age: { type: Sequelize.INTEGER } }); sequelize.sync();
接下来我们需要修改 Schema,使其能够查询数据库中的数据:
const typeDefs = ` type User { id: Int name: String age: Int } type Query { users: [User] } `; const resolvers = { Query: { users: () => User.findAll() } };
以上代码修改了 Schema,添加了一个 User
类型和一个 users
字段。users
字段的解析器会查询数据库中的所有用户,并返回一个包含所有用户的数组。
最后我们需要将 Schema 集成到 Hapi 中:
const Hapi = require('hapi'); const { graphqlHapi, graphiqlHapi } = require('graphql-hapi'); const { makeExecutableSchema } = require('graphql-tools'); const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'postgres' }); const User = sequelize.define('user', { name: { type: Sequelize.STRING }, age: { type: Sequelize.INTEGER } }); sequelize.sync(); const typeDefs = ` type User { id: Int name: String age: Int } type Query { users: [User] } `; const resolvers = { Query: { users: () => User.findAll() } }; const schema = makeExecutableSchema({ typeDefs, resolvers }); const server = new Hapi.Server(); server.connection({ port: 3000 }); server.register([ { register: graphqlHapi, options: { path: '/graphql', graphqlOptions: { schema }, route: { cors: true } } }, { register: graphiqlHapi, options: { path: '/graphiql', graphiqlOptions: { endpointURL: '/graphql' } } } ], (err) => { if (err) { throw err; } server.start((err) => { if (err) { throw err; } console.log(`Server running at: ${server.info.uri}`); }); });
现在我们可以访问 http://localhost:3000/graphiql
来打开 GraphQL Web 界面,然后进行查询。
例如,我们可以查询所有用户的姓名和年龄:
{ users { name age } }
以上代码会查询所有用户的姓名和年龄,并返回一个 JSON 数组。
总结
本文介绍了如何在 Hapi 中使用 GraphQL 进行数据查询,包括创建 Schema、集成到 Hapi 中和查询数据等方面。希望读者能够通过本文学习到如何使用 GraphQL 提高前端开发效率。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65bb3e4badd4f0e0ff3e9937