【发布时间】:2019-12-05 12:25:55
【问题描述】:
假设我们有这个 GraphQL 架构:
type Venue implements Node {
country: Country!
id: ID!
name: String!
nid: String!
url: String!
}
此解析器支持:
// @flow
import type {
VenueRecordType,
ResolverType,
} from '../types';
const Venue: ResolverType<VenueRecordType> = {
country: (node, parameters, context) => {
return context.loaders.CountryByIdLoader.load(node.countryId);
},
};
export default Venue;
我希望能够在解析器字段使用父/节点参数值之前对其进行修改。
据我所知,阅读文档后,实现此目的的唯一方法是实现和包装每个字段,例如
// @flow
import type {
VenueRecordType,
ResolverType,
} from '../types';
const createNodeDecorator = (fieldResolver) => {
const updateNode = (node) => {
// https://media0.giphy.com/media/12NUbkX6p4xOO4/giphy.gif
return node;
};
return (parent, parameteres, context, info) => {
return fieldResolver(updateNode(parent), parameteres, context, info);
};
};
const Venue: ResolverType<VenueRecordType> = {
country: createNodeDecorator((node, parameters, context) => {
return context.loaders.CountryByIdLoader.load(node.countryId);
}),
id: createNodeDecorator((node) => {
return node.id;
}),
name: createNodeDecorator((node) => {
return node.name;
}),
nid: createNodeDecorator((node) => {
return node.nid;
}),
url: createNodeDecorator((node) => {
return node.url;
}),
};
export default Venue;
有没有更好的办法?
理想情况下,我会在使用解析器之前调用一个 __load 挂钩,例如
const Venue: ResolverType<VenueRecordType> = {
__load: (parent, parameteres, context, info, next) => {
next(parent, parameteres, context, info);
},
country: (node, parameters, context) => {
return context.loaders.CountryByIdLoader.load(node.countryId);
},
};
但这(据我所知)不存在。
在传递给解析器之前如何修改父节点?
【问题讨论】:
-
????因为它不仅提供了一个最小的、可复制的,而且还设法在那里的模因中工作
标签: graphql apollo apollo-server