【发布时间】:2019-09-24 10:14:17
【问题描述】:
我觉得我错过了一些明显的东西。我有存储为 [String] 的 ID,我希望能够解析它们所代表的完整对象。
背景
这就是我想要启用的。缺少的成分是解析器:
const bookstore = `
type Author {
id: ID!
books: [Book]
}
type Book {
id: ID!
title: String
}
type Query {
getAuthor(id: ID!): Author
}
`;
const my_query = `
query {
getAuthor(id: 1) {
books { /* <-- should resolve bookIds to actual books I can query */
title
}
}
}
`;
const REAL_AUTHOR_DATA = [
{
id: 1,
books: ['a', 'b'],
},
];
const REAL_BOOK_DATA = [
{
id: 'a',
title: 'First Book',
},
{
id: 'b',
title: 'Second Book',
},
];
想要的结果
我希望能够将[Book] 放在SCHEMA 中任何[String] 存在于DATA 中的位置,并让书籍从这些字符串中自行加载。像这样的:
const resolve = {
Book: id => fetchToJson(`/some/external/api/${id}`),
};
我的尝试
这个解析器什么都不做,console.log 甚至没有被调用
const resolve = {
Book(...args) {
console.log(args);
}
}
但是,这确实得到了一些结果...
const resolve = {
Book: {
id(id) {
console.log(id)
return id;
}
}
}
console.log确实在哪里发出 'a' 和 'b'。但我显然无法将其扩展到 X 个字段,这太荒谬了。
我的团队目前所做的是从父母那里解决它:
const resolve = {
Author: {
books: ({ books }) => books.map(id => fetchBookById(id)),
}
}
这并不理想,因为也许我有一个type Publisher { books: [Book]} 或一个type User { favoriteBooks: [Book] } 或一个type Bookstore { newBooks: [Book] }。在每种情况下,后台的数据实际上是 [String],我不想重复这段代码:
const resolve = {
X: {
books: ({ books }) => books.map(id => fetchBookById(id)),
}
};
定义Book.id 解析器导致console.log 实际触发的事实让我认为这应该是可能的,但我在网上的任何地方都找不到我的答案,这似乎是一个很常见的用途案例,但我在任何地方都找不到实现细节。
我调查了什么
-
Schema Directives 对于得到我想要的东西似乎有点矫枉过正,我只想能够将
[Books]插入到数据中实际存在[String]的任何位置,而不必在每个单独的位置都执行[Books] @rest('/external/api')地点。 - 架构委派。在我的用例中,将 Books 设为可公开查询并不合适,只会使我的 Public 架构与未使用的查询混淆。
感谢您阅读本文。希望有一个我忽略的简单解决方案。如果不是,那GQL你为什么会这样……
【问题讨论】:
标签: javascript node.js graphql