GraphQL 嵌套查询 Lookup
GraphQL nested query Lookup
我正在使用 graphql-tools 生成模式。此查询工作正常
query{
links(id: 1) {
url
resources{
type
active
}
}
}
我的问题是 "resolver" 将用于嵌套查询,以便它 returns 8902 id 的资源。
query{
links(id: 1) {
url
resources(id: 8902) {
type
active
}
}
}
代码如下:
const express = require('express');
const bodyParser = require('body-parser');
const {graphqlExpress, graphiqlExpress} = require('apollo-server-express');
const {makeExecutableSchema} = require('graphql-tools');
const _ = require('lodash');
const links = [
{
id: 1, url: "http://bit.com/xDerS",
resources: [
{id: 8901, type: "file", active: true, cacheable: true},
{id: 8902, type: "file", active: false, cacheable: true}
]
},
{
id: 2,
url: "http://bit.com/aDeRe",
resources: [{id: 8903, type: "file", active: true, cacheable: true}]
}
];
const typeDefs = `type Query { links(id: Int, ): [Link]}
type Link { id: Int, url: String, resources(id: Int): [Resource] }
type Resource {id: Int, type: String, active: Boolean, cacheable: Boolean}`;
const resolvers = {
Query: {
links: (root, arg, context) => {
return arg == null ? links : _.filter(links, {id: arg.id});
}
}
};
const schema = makeExecutableSchema({typeDefs, resolvers});
const app = express();
app.use('/graphql', bodyParser.json(), graphqlExpress({schema}));
app.use('/graphiql', graphiqlExpress({endpointURL: '/graphql'}));
app.listen(3000, () => console.log('Go to http://localhost:3000/graphiql to run queries!'));
您可以为 Link
类型的 resources
字段添加解析器,如下所示:
Query: {
// Query fields
}
Link: {
resources: ({ resources }, { id }) => id
? _.filter(resources, { id })
: resources
}
关键区别在于我们不是从某个来源过滤数据,而是查看父字段(在本例中 links
字段中的每个 Link
)解析为什么。
传递给解析器的第一个参数是表示该信息的对象。对于顶级类型,如 Query
和 Mutation
,这称为根值,它可以为整个模式定义,但实际上应该很少使用(几乎任何你可以放在根值中的东西)可能应该进入你的上下文)。对于任何其他类型,第一个参数将始终反映父字段解析的内容。
我正在使用 graphql-tools 生成模式。此查询工作正常
query{
links(id: 1) {
url
resources{
type
active
}
}
}
我的问题是 "resolver" 将用于嵌套查询,以便它 returns 8902 id 的资源。
query{
links(id: 1) {
url
resources(id: 8902) {
type
active
}
}
}
代码如下:
const express = require('express');
const bodyParser = require('body-parser');
const {graphqlExpress, graphiqlExpress} = require('apollo-server-express');
const {makeExecutableSchema} = require('graphql-tools');
const _ = require('lodash');
const links = [
{
id: 1, url: "http://bit.com/xDerS",
resources: [
{id: 8901, type: "file", active: true, cacheable: true},
{id: 8902, type: "file", active: false, cacheable: true}
]
},
{
id: 2,
url: "http://bit.com/aDeRe",
resources: [{id: 8903, type: "file", active: true, cacheable: true}]
}
];
const typeDefs = `type Query { links(id: Int, ): [Link]}
type Link { id: Int, url: String, resources(id: Int): [Resource] }
type Resource {id: Int, type: String, active: Boolean, cacheable: Boolean}`;
const resolvers = {
Query: {
links: (root, arg, context) => {
return arg == null ? links : _.filter(links, {id: arg.id});
}
}
};
const schema = makeExecutableSchema({typeDefs, resolvers});
const app = express();
app.use('/graphql', bodyParser.json(), graphqlExpress({schema}));
app.use('/graphiql', graphiqlExpress({endpointURL: '/graphql'}));
app.listen(3000, () => console.log('Go to http://localhost:3000/graphiql to run queries!'));
您可以为 Link
类型的 resources
字段添加解析器,如下所示:
Query: {
// Query fields
}
Link: {
resources: ({ resources }, { id }) => id
? _.filter(resources, { id })
: resources
}
关键区别在于我们不是从某个来源过滤数据,而是查看父字段(在本例中 links
字段中的每个 Link
)解析为什么。
传递给解析器的第一个参数是表示该信息的对象。对于顶级类型,如 Query
和 Mutation
,这称为根值,它可以为整个模式定义,但实际上应该很少使用(几乎任何你可以放在根值中的东西)可能应该进入你的上下文)。对于任何其他类型,第一个参数将始终反映父字段解析的内容。