Javascript 在GraphQL中返回关系数据时出现问题

Javascript 在GraphQL中返回关系数据时出现问题,javascript,graphql,graphql-js,Javascript,Graphql,Graphql Js,我正在创建Reddit克隆,我正在首先设置后端,但在创建关系数据时遇到了问题 使用此查询时: query { subreddit(id: 1) { name posts { title } } } 我期望: { "data": { "subreddit": { "name": "javascript" "posts": [ { "title": "JS Post"

我正在创建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:

我正在使用GraphQL桌面应用程序进行查询,但我没有GraphQL瑜伽配置文件


我哪里做错了?我希望有人给我指出正确的方向,这样我就能自己解决问题。这是我第一次单独使用GraphQL,在YouTube上做了一些教程之后,他们使用了GraphQL express,而我使用的是GraphQL瑜伽。

将为查询帖子编写的解析器移动到Subreddit中,以解析那里的帖子字段。如果您的冲突解决程序不符合默认的冲突解决程序实现:

(parent) => parent[fieldName]
就像你的情况一样

(parent) => parent.posts
你必须自己指定它。如果查询中的字段POST应显示所有POST,则您可能希望使用以下实现:

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;
    }
  }
};

我必须为subreddit添加一个解析器来处理帖子


您已经显示了预期的结果,但没有显示您在进行查询时实际看到的结果或返回的错误。看看您是如何实际进行查询的也很好实际的查询是什么,您是否通过客户端GraphiQL或Postman之类的工具将其发送到服务器?此外,您还没有包括解析程序或graphql瑜伽configuration@DanielRearden哦,我忘了加那个了。我将编辑该问题以将其包括在内。我正在使用GraphQL桌面。我已经包括了解析器。它们在const resolvers={…}中,const resolvers={…}位于server/index.js中。我没有配置文件。我只是说你应该包括如何配置GraphQLServer实例:你是对的。这就是问题所在。一位朋友想出来了,不过还是要感谢你抽出时间来帮忙!
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;
    }
  }
};
const resolvers = {
  Query: {
    subreddits: () => dummySubreddits,
    subreddit: (parent, args) => {
      return dummySubreddits.find(obj => obj.id == args.id);
    },
    posts: (parent, args) => {
      return dummyPosts;
    },
    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;
    }
  },

  // This resolver was needed
  Subreddit: {
    posts: subreddit =>
      dummyPosts.filter(obj => obj.subredditId == subreddit.id)
  }
};