【问题标题】:Apollo GraphQL - resolver not being triggeredApollo GraphQL - 未触发解析器
【发布时间】:2021-01-25 23:33:53
【问题描述】:

我是 GraphQL 新手。我从 Javascript Apollo 库开始,无法启动解析器。我很难说什么时候应该调用解析器,以及我应该放什么键。

这是我的架构和解析器:

// The GraphQL schema in string form
const typeDefs = `
  type Query { user(id: ID!): User, posts: Post }
  type User  { id: ID!, created: Int, username: String, bio: String, status: String, avatar: String, posts: [Post] }
  type Post { id: ID!, created: Int, user_id: Int, text: String, object_set_id: Int, edited: Int, views: Int, upvotes: Int, downvotes: Int, Parent: Int }
`;

// The resolvers
const resolvers = {
    Query: {
        user: (parent, args, context, info) => {
            return users.find(user => user.id === Number(args.id));
        },
        // posts: () => posts,
    },
    Post: {
        id: (parent, args, context, info) => {
            console.log(posts.filter(post => post.user_id === Number(parent.id)))
            return posts.filter(post => post.user_id === Number(parent.id))
        }
    }
};

我想通过用户 ID 指定用户,然后向下过滤以获取该用户发布的所有帖子(最终使用时间过滤器)。

我尝试了几件事,但用户下的“帖子”总是出现“空”。我错过了什么?谢谢。

【问题讨论】:

  • ...以及您正在关注的教程?
  • 您的,已注释掉,Query.posts 解析器不返回帖子列表/数组,然后没有调用链接的 Post 解析器(它应该返回一篇帖子,当 Query.posts 返回所有帖子时不需要帖子字段)
  • 请告诉我们你的users数组的值
  • 那个Post.id 解析器没有意义,它需要返回一个ID!,但似乎返回一个帖子数组。你的意思是写一个User.posts 解析器吗?

标签: javascript graphql apollo


【解决方案1】:

用户(或更多语义:userById)查询

您的第一个查询运行良好。 您还应该添加一些data(否则您会收到错误"message": "users is not defined",)。

执行查询:

query{
  user(id: 1){
    id
    username
  }
}

基本代码示例:

const { ApolloServer, gql } = require("apollo-server");

const users = [
  {
    id: 1,
    username: "Kate Chopin"
  },
  {
    id: 2,
    username: "Paul Auster"
  }
];

// The GraphQL schema in string form
const typeDefs = gql`
  type Query {
    userById(id: ID!): User
  }
  type User {
    id: ID!
    username: String
  }
`;

// The resolvers
const resolvers = {
  Query: {
    userById: (parent, args, context, info) => {
      return users.find((user) => user.id === Number(args.id));
    }
  }
};

const server = new ApolloServer({
  typeDefs,
  resolvers
});

server.listen().then(({ url }) => {
  console.log(`? Server ready at ${url}`);
});

帖子查询(或更语义化:postById):

关于 posts - 您的查询是 posts 并且没有解析器匹配 + 看起来您做了一点“沙拉”。

最好遵循这个例子(Same ideabooks/authors 而不是 posts/user): https://www.apollographql.com/docs/apollo-server/getting-started/

接下来,阅读此解析器链https://www.apollographql.com/docs/apollo-server/data/resolvers/#resolver-chains

再次hello world 示例


const posts = [
  {
    id: 1,
    name: "Article One"
  },
  {
    id: 2,
    name: "Article Two"
  }
];

const users = [
  {
    id: 1,
    username: "Kate Chopin",
    posts: posts
  },
  {
    id: 2,
    username: "Paul Auster"
  }
];

// The GraphQL schema in string form
const typeDefs = gql`
  type Query {
    userById(id: ID!): User
  }
  type User {
    id: ID!
    username: String
    posts: [Post]
  }
  type Post {
    id: ID!
    name: String
  }
`;

// The resolvers
const resolvers = {
  Query: {
    userById: (parent, args, context, info) => {
      return users.find((user) => user.id === Number(args.id));
    }
  }
};

const server = new ApolloServer({
  typeDefs,
  resolvers
});

server.listen().then(({ url }) => {
  console.log(`? Server ready at ${url}`);
});

查询:

【讨论】:

  • 这很好,但看起来我可以使用这样的解析器:用户:{ 帖子:(父,参数,上下文,信息)=> { console.log(posts.filter(post => post.user_id === Number(parent.id))) return posts.filter(post => post.user_id === Number(parent.id)) } } 那么 Users -> Posts 的逻辑是' t 烘烤,除非要求。
猜你喜欢
  • 2021-09-25
  • 2018-09-30
  • 2020-01-28
  • 2021-03-25
  • 1970-01-01
  • 2020-07-22
  • 2019-08-16
  • 2020-01-31
  • 2019-05-18
相关资源
最近更新 更多