Apollo GraphQL - 未触发解析器

Posted

技术标签:

【中文标题】Apollo GraphQL - 未触发解析器【英文标题】:Apollo GraphQL - resolver not being triggered 【发布时间】: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 指定用户,然后向下过滤以获取该用户发布的所有帖子(最终使用时间过滤器)。

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

【问题讨论】:

...以及您正在关注的教程? apollographql.com/docs/apollo-server/getting-started 然后在这里查看解析器链:apollographql.com/docs/apollo-server/data/resolvers 您的,已注释掉,Query.posts 解析器不返回帖子列表/数组,然后没有调用链接的 Post 解析器(它应该返回一篇帖子,当 Query.posts 返回所有帖子时不需要帖子字段) 请告诉我们你的users数组的值 那个Post.id 解析器没有意义,它需要返回一个ID!,但似乎返回一个帖子数组。你的意思是写一个User.posts 解析器吗? 【参考方案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 烘烤,除非要求。

以上是关于Apollo GraphQL - 未触发解析器的主要内容,如果未能解决你的问题,请参考以下文章

上下文未传递给嵌套的 Apollo GraphQL 解析器

Apollo 客户端解析器仅触发一次

Apollo 2.x:订阅解析器未触发?

Graphql apollo 服务器解析器参数类型

Apollo 订阅解析器永远不会激活?

在 Apollo 中查找缺失的 GraphQL 解析器