javascript - 在 GraphQL 中是否可以在对象类型级别上使用解析器?
问题描述
我们正在研究一个相当复杂的 GraphQL 模式,其中我们有几种属于各种微服务的对象类型,其中每种对象类型都有一个我们可以查询的自然 API 端点。因此,如果可以直接为某些对象类型定义特定的解析器,那将非常方便,执行如下操作:
const typeDefs = gql`
type Query {
getBook(bookId: ID!): BookPayload
}
type BookPayload {
book: Book
userErrors: UserError
}
type Book {
id: ID!
title: String
author: String
}
`;
const resolvers = {
Query: {
getBook: (parent, args, context, info) => {
return {
book: { id: args.bookId }
}
},
Book: (parent) => { // this object type level resolver doesn't seem to work
return {
id: parent.id,
...fetchBookMetadata(parent.id)
};
}
};
我知道这是一个微不足道的例子,可能看起来有点过度设计,但当模式开始变得非常复杂时,它确实更有意义(至少对我们来说),到处都是数百个交叉引用。现在有解决这个问题的好方法吗?
解决方案
是的,您应该能够使用指令执行此操作或非常类似的操作,请查看:
我将在此处逐字发布本文中的引文和示例。
假设您已经定义了一个对应于 REST 资源的对象类型,并且您希望避免为每个字段实现解析器函数
const typeDefs = `
directive @rest(url: String) on FIELD_DEFINITION
type Query {
people: [Person] @rest(url: "/api/v1/people")
}`;
class RestDirective extends SchemaDirectiveVisitor {
public visitFieldDefinition(field) {
const { url } = this.args;
field.resolve = () => fetch(url);
}
}
根据规范,GraphQL 执行引擎在选择集上运行,这些选择集被分解为单独的字段。将检查每个字段的值或现有解析器。
似乎如果你定义了一个类似上面的指令,你不会改变这个基本行为,但你会拦截并添加一个额外的自定义步骤,以便在进一步解决之前执行。
自定义标量可能会出现类似的情况,但这不适用于模式设计。
推荐阅读
- powershell - 如何了解运行 UWP 应用程序的用户
- c# - 无法读取 PR_SECURITY_FLAGS,获取随机数
- javascript - 如何从谷歌方向结果中获取可拖动航点的位置
- python - Pandas - 将滚动应用于列速度
- android - 卡片视图布局和分隔线颜色的显着性
- kableextra - 特殊字符(大括号)使用 collapse_rows() 获得不需要的反斜杠
- xmpp - Ejabberd:从客户端连接时无法启动 BOSH 会话
- tmux - Tmux 绑定键不适用于拆分窗口
- javascript - 使用 Angular 应用程序使用 SOAP Web 服务
- c# - WPF MVVM 兼容方式打开视图