【问题标题】:Split the graphql resolvers file into seperatefiles将 graphql 解析器文件拆分为单独的文件
【发布时间】: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 文件结合起来?这样我也可以拆分模式并将用户的模式/解析器放入文件中。我仍然是编码的初学者。

【问题讨论】:

    标签: graphql apollo


    【解决方案1】:

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

    const { merge } = require("lodash");
    
    module.exports = makeExecutableSchema({
      typeDefs: [typeDefs, userTypeDefs],
      resolvers: merge(resolvers, userResolvers)
    });
    

    【讨论】:

    【解决方案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 来执行此操作。只是要注意代码中的一些术语。如果您选择我的答案而不是您的答案,我将不胜感激,以便我得到积分。
      猜你喜欢
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 2015-05-25
      • 1970-01-01
      • 2018-06-24
      • 2020-01-12
      • 1970-01-01
      相关资源
      最近更新 更多