如何使用 apollo graphQL 拼接模式?
How to stitch schemas using apollo graphQL?
我是一名 java 程序员,正在学习 graphQL。我有如下示例的数据集,其中评论有 postId,但 post 没有评论信息。
comments
{
"postId": 1,
"id": 1,
"name": "id labore ex et quam laborum",
"email": "Eliseo@gardner.biz",
"body": "laudantium enim quasi"
}
post
{
"userid": 3,
"id": 1,
"title": "Post 1"
}
使用阿波罗联邦
我可以在 Post 回复中提供评论详情吗?
{
"data": {
"posts": [
{
"userid": 3,
"id": 1,
"title": "Post 1"
"comments":
{
"id": 1,
"name": "id labore ex et quam laborum",
"email": "Eliseo@gardner.biz",
"body": "laudantium enim quasi"
}
}
]
}
我基本上需要使用以下算法
- 获取所有评论
- 使用给定的 postId
过滤评论
- 从解析器函数
收集所有匹配的评论和return
下面是post.js代码
type Post @key(fields: "id"){
id: ID!
userid: Int!
title: String!
comments: [Comment]
}
extend type Comment @key(fields: "id" ){
id: ID! @external
}
const resolvers = {
Post: {
comments(post){
return ( { __typename: "Post", postId:post.id });
}
Query: {
post: (root, { id }, { dataSources }) => dataSources.mvrpAPI.getAPost(id),
posts: (root, args, { dataSources }) => dataSources.mvrpAPI.getAllPosts()}
使用上面解析器的注释方法我得到以下错误
"message": "Expected Iterable, but did not find one for field
\"Post.comments\".",
然后我尝试了下面的解析器方法,但它无法识别 mvrpAPI,即使它在解析器的查询部分工作
async comments(post, {dataSources}){
const allComments = dataSources.mvrpAPI.getAllComments();;
return allComments.postId.findAll(
{ __typename: "Post", postId:post.id }
);
}
}
有人可以帮助如何在 graphql 中编写上述逻辑(第 2 点)。
您在 Post 架构上将注释声明为列表,而在解析器上您返回单个对象
return ( { __typename: "Post", postId:post.id });
这就是 "Expected Iterable" 错误的原因。
我不熟悉那个数据库 api,但这对大多数 api 来说应该不难。
在猫鼬中它会像
async (post,_, {model}) => model.Comment.find({postId: post.id})
这是我解决上述问题的方法
- response.filter 重新调整数组,因为我正在寻找具有特定 post id 的注释数组,所以将条件放入 map 函数中很有帮助。
dataSources.mvrpAPI.getAllComments() 给出 Promise 。为了获得真实的对象,我使用了 "await" 并且由于 await 只能从异步函数中使用,所以我将注释函数设为异步。
async comments(post, {postid}, {dataSources}){
const response = await dataSources.mvrpAPI.getAllComments();
return response.filter(comment => comment.postId === post.id);
}
},
我是一名 java 程序员,正在学习 graphQL。我有如下示例的数据集,其中评论有 postId,但 post 没有评论信息。
comments
{
"postId": 1,
"id": 1,
"name": "id labore ex et quam laborum",
"email": "Eliseo@gardner.biz",
"body": "laudantium enim quasi"
}
post
{
"userid": 3,
"id": 1,
"title": "Post 1"
}
使用阿波罗联邦
我可以在 Post 回复中提供评论详情吗?
{ "data": { "posts": [ { "userid": 3, "id": 1, "title": "Post 1" "comments": { "id": 1, "name": "id labore ex et quam laborum", "email": "Eliseo@gardner.biz", "body": "laudantium enim quasi" } } ] }
我基本上需要使用以下算法
- 获取所有评论
- 使用给定的 postId 过滤评论
- 从解析器函数 收集所有匹配的评论和return
下面是post.js代码
type Post @key(fields: "id"){ id: ID! userid: Int! title: String! comments: [Comment] } extend type Comment @key(fields: "id" ){ id: ID! @external } const resolvers = { Post: { comments(post){ return ( { __typename: "Post", postId:post.id }); } Query: { post: (root, { id }, { dataSources }) => dataSources.mvrpAPI.getAPost(id), posts: (root, args, { dataSources }) => dataSources.mvrpAPI.getAllPosts()}
使用上面解析器的注释方法我得到以下错误
"message": "Expected Iterable, but did not find one for field
\"Post.comments\".",
然后我尝试了下面的解析器方法,但它无法识别 mvrpAPI,即使它在解析器的查询部分工作
async comments(post, {dataSources}){
const allComments = dataSources.mvrpAPI.getAllComments();;
return allComments.postId.findAll(
{ __typename: "Post", postId:post.id }
);
}
}
有人可以帮助如何在 graphql 中编写上述逻辑(第 2 点)。
您在 Post 架构上将注释声明为列表,而在解析器上您返回单个对象
return ( { __typename: "Post", postId:post.id });
这就是 "Expected Iterable" 错误的原因。
我不熟悉那个数据库 api,但这对大多数 api 来说应该不难。
在猫鼬中它会像
async (post,_, {model}) => model.Comment.find({postId: post.id})
这是我解决上述问题的方法
- response.filter 重新调整数组,因为我正在寻找具有特定 post id 的注释数组,所以将条件放入 map 函数中很有帮助。
dataSources.mvrpAPI.getAllComments() 给出 Promise 。为了获得真实的对象,我使用了 "await" 并且由于 await 只能从异步函数中使用,所以我将注释函数设为异步。
async comments(post, {postid}, {dataSources}){ const response = await dataSources.mvrpAPI.getAllComments(); return response.filter(comment => comment.postId === post.id); } },