如何使用 GraphQL Yoga 进行多嵌套查询(GET 请求)?
How to do multiple nested query (GET request) with GraphQL Yoga?
如何使用 GraphQL Yoga 进行多嵌套查询?
这是我的数据
{
"user": [{
"id": 1,
"name": "Thomas",
"comment_id": [1, 2, 3]
},
{
"id": 2,
"name": "Riza",
"comment_id": [4, 5, 6]
}
],
"comment": [{
"id": 1,
"body": "comment 1"
},
{
"id": 2,
"body": "comment 2"
},
{
"id": 3,
"body": "comment 3"
}
]
}
场景是我想查询一个特定用户及其所有评论,但该用户只存储 comment
个 ID。
这是我的代码
const { GraphQLServer } = require('graphql-yoga');
const axios = require('axios');
const typeDefs = `
type Query {
user(id: Int!): User
comment(id: Int!): Comment
}
type User {
id: Int
name: String
comment: [Comment]
}
type Comment {
id: Int
body: String
}
`;
const resolvers = {
Query: {
user(parent, args) {
return axios
.get(`http://localhost:3000/user/${args.id}`)
.then(res => res.data)
.catch(err => console.log(err));
},
comment(parent, args) {
return axios
.get(`http://localhost:3000/comment/${args.id}`)
.then(res => res.data)
.catch(err => console.log(err));
},
},
User: {
comment: parent =>
axios
.get(`http://localhost:3000/comment/${parent.comment_id}`)
.then(res => res.data)
.catch(err => console.log(err)),
},
};
const server = new GraphQLServer({ typeDefs, resolvers });
server.start(() => console.log('Server is running on localhost:4000'));
所需查询
{
user(id: 1) {
id
name
comment {
id
body
}
}
}
但是return没有找到,因为axios
命中的终点是http://localhost:3000/comment/1,2,3'
我怎样才能return所有用户的评论?
谢谢大家!
假设评论 API /comment/:id
只接受单个 ID,您需要为每个评论 ID 调用一个 API(除非有一个 API 需要多个 ID 和 return 他们的数据),然后 return 来自 User
类型的 comment
字段解析器的响应。
comment
字段的解析器在这种情况下的样子:
User: {
comment: parent => {
let results = await Promise.all(parent.comment_id.map((id) => axios.get(`http://localhost:3000/comment/${id}`)))
return results.map((result) => result.data)
}
}
显然我也找到了这个其他解决方案
User: {
comment: parent =>
parent.comment_id.map(id =>
axios.get(`http://localhost:3000/comment/${id}`).then(res => res.data)
),
},
性能方面,你觉得哪个更好?
如何使用 GraphQL Yoga 进行多嵌套查询?
这是我的数据
{
"user": [{
"id": 1,
"name": "Thomas",
"comment_id": [1, 2, 3]
},
{
"id": 2,
"name": "Riza",
"comment_id": [4, 5, 6]
}
],
"comment": [{
"id": 1,
"body": "comment 1"
},
{
"id": 2,
"body": "comment 2"
},
{
"id": 3,
"body": "comment 3"
}
]
}
场景是我想查询一个特定用户及其所有评论,但该用户只存储 comment
个 ID。
这是我的代码
const { GraphQLServer } = require('graphql-yoga');
const axios = require('axios');
const typeDefs = `
type Query {
user(id: Int!): User
comment(id: Int!): Comment
}
type User {
id: Int
name: String
comment: [Comment]
}
type Comment {
id: Int
body: String
}
`;
const resolvers = {
Query: {
user(parent, args) {
return axios
.get(`http://localhost:3000/user/${args.id}`)
.then(res => res.data)
.catch(err => console.log(err));
},
comment(parent, args) {
return axios
.get(`http://localhost:3000/comment/${args.id}`)
.then(res => res.data)
.catch(err => console.log(err));
},
},
User: {
comment: parent =>
axios
.get(`http://localhost:3000/comment/${parent.comment_id}`)
.then(res => res.data)
.catch(err => console.log(err)),
},
};
const server = new GraphQLServer({ typeDefs, resolvers });
server.start(() => console.log('Server is running on localhost:4000'));
所需查询
{
user(id: 1) {
id
name
comment {
id
body
}
}
}
但是return没有找到,因为axios
命中的终点是http://localhost:3000/comment/1,2,3'
我怎样才能return所有用户的评论? 谢谢大家!
假设评论 API /comment/:id
只接受单个 ID,您需要为每个评论 ID 调用一个 API(除非有一个 API 需要多个 ID 和 return 他们的数据),然后 return 来自 User
类型的 comment
字段解析器的响应。
comment
字段的解析器在这种情况下的样子:
User: {
comment: parent => {
let results = await Promise.all(parent.comment_id.map((id) => axios.get(`http://localhost:3000/comment/${id}`)))
return results.map((result) => result.data)
}
}
显然我也找到了这个其他解决方案
User: {
comment: parent =>
parent.comment_id.map(id =>
axios.get(`http://localhost:3000/comment/${id}`).then(res => res.data)
),
},
性能方面,你觉得哪个更好?