在 Hapi 中使用 GraphQL 进行数据查询

GraphQL 是一种由 Facebook 开发的查询语言,它可以帮助前端开发者更高效地进行数据查询和获取。在 Hapi 中使用 GraphQL 可以让我们更加方便地查询后端数据,本文将介绍如何在 Hapi 中使用 GraphQL 进行数据查询。

安装 GraphQL

首先,我们需要安装 GraphQL。使用 npm 安装即可:

创建 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-hapigraphiql 两个库:

然后在 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 服务器,并注册了 graphqlHapigraphiqlHapi 两个插件。其中 graphqlHapi 插件用于处理 GraphQL 查询,graphiqlHapi 插件用于提供一个 GraphQL 的 Web 界面。

现在我们可以访问 http://localhost:3000/graphiql 来打开 GraphQL Web 界面,并进行查询。

查询数据

下面我们来看一个更加复杂的例子,如何查询一个数据库中的数据。

首先,我们需要安装 sequelizepg 两个库:

然后我们创建一个 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