如何在 GraphQL 中处理多个数据源

GraphQL 是一种查询语言,可以让前端开发者从多个数据源中获取所需的数据。在实际开发中,我们可能需要从多个数据源中获取数据,例如从不同的 API 中获取数据,或者从数据库中获取数据。在这篇文章中,我们将介绍如何在 GraphQL 中处理多个数据源,以及如何使用 Schema Stitching 将多个 GraphQL Schema 合并为一个。

处理多个数据源

在 GraphQL 中,我们可以使用 resolver 来从数据源中获取数据。当我们需要从多个数据源中获取数据时,我们可以编写多个 resolver 来分别从不同的数据源中获取数据,然后将这些数据合并为一个 GraphQL 查询的结果。

下面是一个例子,假设我们需要从两个不同的 API 中获取数据,一个是获取用户信息的 API,另一个是获取文章信息的 API。

type User {
  id: ID!
  name: String!
  email: String!
}

type Article {
  id: ID!
  title: String!
  content: String!
  authorId: ID!
}

type Query {
  user(id: ID!): User
  article(id: ID!): Article
}

我们可以编写两个 resolver,一个用于获取用户信息,另一个用于获取文章信息。

const { RESTDataSource } = require('apollo-datasource-rest');

class UserAPI extends RESTDataSource {
  constructor() {
    super();
    this.baseURL = 'https://example.com/api/users/';
  }

  async getUser(id) {
    return this.get(`/${id}`);
  }
}

class ArticleAPI extends RESTDataSource {
  constructor() {
    super();
    this.baseURL = 'https://example.com/api/articles/';
  }

  async getArticle(id) {
    return this.get(`/${id}`);
  }
}

const resolvers = {
  Query: {
    user: async (_, { id }, { dataSources }) => {
      return dataSources.userAPI.getUser(id);
    },
    article: async (_, { id }, { dataSources }) => {
      return dataSources.articleAPI.getArticle(id);
    },
  },
};

module.exports = {
  resolvers,
  dataSources: () => ({
    userAPI: new UserAPI(),
    articleAPI: new ArticleAPI(),
  }),
};

在这个例子中,我们使用了 apollo-datasource-rest 来访问 REST API,但是你也可以使用其他的库或自己编写代码来访问其他类型的数据源。我们将两个 API 的 endpoint 分别设置为 https://example.com/api/users/https://example.com/api/articles/,然后分别编写了 UserAPIArticleAPI 来访问这两个 API。

在 resolver 中,我们使用了 dataSources 参数来访问 UserAPIArticleAPI,然后分别调用了 getUsergetArticle 方法来获取数据。

使用 Schema Stitching

在实际开发中,我们可能需要从多个 GraphQL Schema 中获取数据。例如,我们可能有一个用户信息的 GraphQL Schema 和一个文章信息的 GraphQL Schema,我们需要将这两个 Schema 合并为一个,然后从中获取数据。

在 GraphQL 中,我们可以使用 Schema Stitching 来将多个 GraphQL Schema 合并为一个。Schema Stitching 可以让我们将多个 GraphQL Schema 中的类型和 resolver 合并为一个,然后让我们可以从合并后的 Schema 中获取数据。

下面是一个例子,假设我们有一个用户信息的 GraphQL Schema 和一个文章信息的 GraphQL Schema。

# 用户信息的 GraphQL Schema
type User {
  id: ID!
  name: String!
  email: String!
}

type Query {
  user(id: ID!): User
}

# 文章信息的 GraphQL Schema
type Article {
  id: ID!
  title: String!
  content: String!
  authorId: ID!
}

type Query {
  article(id: ID!): Article
}

我们可以使用 graphql-tools 来将这两个 Schema 合并为一个。

const { mergeSchemas } = require('graphql-tools');
const { makeExecutableSchema } = require('graphql-tools');

const userSchema = makeExecutableSchema({
  typeDefs: `
    type User {
      id: ID!
      name: String!
      email: String!
    }

    type Query {
      user(id: ID!): User
    }
  `,
  resolvers: {
    Query: {
      user: async (_, { id }, { dataSources }) => {
        return dataSources.userAPI.getUser(id);
      },
    },
  },
});

const articleSchema = makeExecutableSchema({
  typeDefs: `
    type Article {
      id: ID!
      title: String!
      content: String!
      authorId: ID!
    }

    type Query {
      article(id: ID!): Article
    }
  `,
  resolvers: {
    Query: {
      article: async (_, { id }, { dataSources }) => {
        return dataSources.articleAPI.getArticle(id);
      },
    },
  },
});

const schema = mergeSchemas({
  schemas: [userSchema, articleSchema],
});

module.exports = {
  schema,
  dataSources: () => ({
    userAPI: new UserAPI(),
    articleAPI: new ArticleAPI(),
  }),
};

在这个例子中,我们使用了 makeExecutableSchema 来创建了两个 GraphQL Schema,一个是用户信息的 Schema,另一个是文章信息的 Schema。然后我们将这两个 Schema 合并为一个,使用 mergeSchemas 函数来将这两个 Schema 合并为一个。

在 resolver 中,我们使用了 dataSources 参数来访问 UserAPIArticleAPI,然后分别调用了 getUsergetArticle 方法来获取数据。

总结

在这篇文章中,我们介绍了如何在 GraphQL 中处理多个数据源,以及如何使用 Schema Stitching 将多个 GraphQL Schema 合并为一个。在实际开发中,我们可能需要从多个数据源中获取数据,使用 resolver 来获取数据,然后将这些数据合并为一个 GraphQL 查询的结果。如果我们需要从多个 GraphQL Schema 中获取数据,可以使用 Schema Stitching 来将这些 Schema 合并为一个,然后从中获取数据。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658aa038eb4cecbf2dfdb480


纠错
反馈