将 graphql 解析器文件拆分为单独的文件

Posted

技术标签:

【中文标题】将 graphql 解析器文件拆分为单独的文件【英文标题】:Split the graphql resolvers file into seperatefiles 【发布时间】:2019-04-27 05:38:06 【问题描述】:

我正在使用 GraphQL,并且有一个如下所示的 resolvers.js 文件:

const User = require("../models/User");
const Post = require("../models/Post");

module.exports = 
  Query: 
    async users()...,
    async user()...,
    async posts()...,
    async post()...,
  ,
  User: ...,
  Post: ...,
  Mutation: 
    createUser()...,
    login()...,
    createPost()...,
  ,

但是如果我有更多的模型、查询和突变,文件会很长。如何将其拆分为单独的文件?一种用于用户查询和突变,一种用于帖子等。或者那不可能?也许有办法将它与 schema.js 文件结合起来?这样我也可以拆分模式并将用户的模式/解析器放入文件中。我仍然是编码的初学者。

【问题讨论】:

【参考方案1】:

实际上,我找到了一种非常简单的方法。在 schema.js 中,我可以使用 lodash merge 来组合多个解析器文件,对于 typedef,我只使用一个数组。这样我可以将所有内容拆分为单独的文件。

const  merge  = require("lodash");

module.exports = makeExecutableSchema(
  typeDefs: [typeDefs, userTypeDefs],
  resolvers: merge(resolvers, userResolvers)
);

【讨论】:

blog.apollographql.com/… 提供此解决方案,如果有人想了解更多细节。【参考方案2】:

以防万一有人在 2020 年寻找答案,

我有类似的问题, 我试图调整提到的方法, 但找到了一种更简单的方法来解决问题。

我用graphql-toolsmergeResolvers解决了这个问题-https://www.graphql-tools.com/docs/merge-resolvers/

示例代码是这样的

const  mergeResolvers  = require('@graphql-tools/merge');
const clientResolver = require('./clientResolver');
const productResolver = require('./productResolver');

const resolvers = [
  clientResolver,
  productResolver,
];

module.exports mergeResolvers(resolvers);

lodash merge 不会区分 QueryMutation, 因此在我的情况下抛出错误。

【讨论】:

【参考方案3】:

这就是我的做法。请注意,这是在 Typescript 中。

您可以在单独的文件中定义解析器,例如:

import  DateBidListResolvers  from "../../types/generated";

export const DateBidList: DateBidListResolvers.Type = 
  ...DateBidListResolvers.defaultResolvers,

  list: (_, __) =>  // This is an example resolver of Type DateBidList
    throw new Error("Resolver not implemented");
  
;

然后您可以将它们聚合到一个文件中,如下所示:

import  Resolvers  from "../../types/generated";

import  Query  from "./Query";
import  User  from "./User";
import  DateBid  from "./DateBid";
import  DateItem  from "./DateItem";
import  Match  from "./Match";
import  Mutation  from "./Mutation";
import  Subscription  from "./Subscription";
import  DateBidList  from "./DateBidList";
import  DateList  from "./DateList";
import  Following  from "./Following";
import  MatchList  from "./MatchList";
import  Message  from "./Message";
import  MessageItem  from "./MessageItem";
import  Queue  from "./Queue";

export const resolvers: Resolvers = 
  DateBid,
  DateBidList,
  DateItem,
  DateList,
  Following,
  Match,
  MatchList,
  Message,
  MessageItem,
  Mutation,
  Query,
  Queue,
  Subscription,
  User
;

然后您可以将该解析器导出到您的配置设置中:

import  resolvers  from './resolvers/index';

// ... other imports here

export const server = 
  typeDefs,
  resolvers,
  playground,
  context,
  dataSources,
;

export default new ApolloServer(server);

我希望这会有所帮助!

【讨论】:

从未使用过 Typescript。将看看如何使用它。谢谢。 您不需要 Typescript 来执行此操作。只是要注意代码中的一些术语。如果您选择我的答案而不是您的答案,我将不胜感激,以便我得到积分。

以上是关于将 graphql 解析器文件拆分为单独的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Kickstart Spring Boot GraphQL 在逻辑上拆分我的 GraphQL 架构和解析器

如何使用 Apollo 分离 GraphQL 模式和解析器文件?

Serverless graphql 拆分成微服务

AppSync GraphQL 模拟解析器映射未生成唯一项目

如何使用一个查询来解决 graphQL 中的多个 Rest 往返?

无法将自定义结果从解析器传递到 Graphql