gpt4 book ai didi

javascript - 在 GraphQL 中返回关系数据时遇到问题

转载 作者:行者123 更新时间:2023-12-03 01:48:52 25 4
gpt4 key购买 nike

我正在创建 Reddit 克隆,并首先设置后端,但在创建关系数据时遇到问题。

当我使用此查询时:

query {
subreddit(id: 1) {
name
posts {
title
}
}
}

我期望:

{
"data": {
"subreddit": {
"name": "javascript"
"posts": [
{
"title": "JS Post"
}
]
}
}
}

我得到了什么:

{
"data": null,
"errors": [
{
"message": "Cannot return null for non-nullable field Subreddit.posts.",
"locations": [
{
"line": 4,
"column": 5
}
],
"path": [
"subreddit",
"posts"
]
}
]
}

这是架构:

type Query {
subreddits: [Subreddit!]!
subreddit(id: ID!): Subreddit!
posts: [Post!]!
post(id: ID!): Post!
}

type Mutation {
createSubreddit(
name: String!
description: String!
contentType: String!
ageRestriction: Boolean!
): Subreddit!
}

type Subreddit {
id: ID!
name: String!
description: String!
contentType: String!
ageRestriction: Boolean!
posts: [Post!]!
}

type Post {
id: ID!
title: String!
body: String!
subredditId: ID!
# userId: ID!
}

这是server/index.js:

const { GraphQLServer } = require('graphql-yoga');

let dummySubreddits = [
{
name: 'javascript',
description: 'all things javascript',
contentType: 'any',
ageRestriction: false,
id: 1
},
{
name: 'react',
description: 'all things react',
contentType: 'any',
ageRestriction: false,
id: 2
},
{
name: 'primsa',
description: 'all things prisma',
contentType: 'any',
ageRestriction: false,
id: 3
}
];
let idCountSubreddit = dummySubreddits.length;

let dummyPosts = [
{ title: 'JS Post', body: 'Body of post one', id: 1, subredditId: 1 },
{ title: 'React Post', body: 'Body of post two', id: 2, subredditId: 2 },
{
title: 'Prisma Post',
body: 'Body of post three',
id: 3,
subredditId: 3
}
];
let idCountPost = dummyPosts.length;

const resolvers = {
Query: {
subreddits: () => dummySubreddits,
subreddit: (parent, args) => {
return dummySubreddits.find(obj => obj.id == args.id);
},
posts: () => (parent, args) => {
return dummyPosts.find(obj => obj.subredditId == parent.id);
},
post: (parent, args) => {
return dummyPosts.find(obj => obj.id == args.id);
}
},
Mutation: {
createSubreddit: (parent, args) => {
let subreddit = {
id: idCountSubreddit++,
name: args.name,
description: args.description,
contentType: args.contentType,
ageRestriction: args.ageRestriction
};
return subreddit;
}
}
};

const server = new GraphQLServer({ typeDefs: './schema.graphql', resolvers });
server.start(() => console.log('Server is running on localhost:4000'));

我使用 GraphQL 桌面应用进行查询,但没有 grapql-yoga 配置文件。

我哪里出错了?我希望有人指出正确的方向,这样我就可以自己找出答案。这是我第一次单独使用 GraphQL,在 YouTube 上学习了一些教程之后,他们使用了 graphql-express,而我使用的是 graphql-yoga

最佳答案

将您为 Queryposts 编写的解析器移至 Subreddit 中,以解析那里的 posts 字段。如果您的解析器不符合默认解析器实现:

(parent) => parent[fieldName]

就像你的情况

(parent) => parent.posts

您必须自己指定。如果 Query 上的字段 posts 应显示您可能想要进行以下实现的所有帖子:

const resolvers = {
Query: {
subreddits: () => dummySubreddits,
subreddit: (parent, args) => {
return dummySubreddits.find(obj => obj.id == args.id);
},
posts: () => dummyPosts,
post: (parent, args) => {
return dummyPosts.find(obj => obj.id == args.id);
}
},
Subreddit: {
posts: () => (parent, args) =>
dummyPosts.filter(obj => obj.subredditId == parent.id),
},
Mutation: {
createSubreddit: (parent, args) => {
let subreddit = {
id: idCountSubreddit++,
name: args.name,
description: args.description,
contentType: args.contentType,
ageRestriction: args.ageRestriction
};
return subreddit;
}
}
};

关于javascript - 在 GraphQL 中返回关系数据时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50509567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com