将 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-tools
的mergeResolvers
解决了这个问题-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
不会区分 Query
和 Mutation
,
因此在我的情况下抛出错误。
【讨论】:
【参考方案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 模式和解析器文件?
AppSync GraphQL 模拟解析器映射未生成唯一项目