graphql.js:即使解析器正在为 sequilize 查询返回值,该字段仍为空

Posted

技术标签:

【中文标题】graphql.js:即使解析器正在为 sequilize 查询返回值,该字段仍为空【英文标题】:graphql.js: field is null even though resolver is returning value for sequilize query 【发布时间】:2018-08-04 18:00:55 【问题描述】:

我有以下 graphql 架构,我正在尝试执行 businessUser 查询

type Query 
  businessUser(id: String!): BusinessUser


type BusinessUser 
  id: ID!,
  firstName: String,
  lastName: String,
  email: String,
  posts: [BusinessPostFormat]


type BusinessPostFormat 
  postId: Int,
  user: String,
  isActive: Boolean,
  postText: String

在我的解析器中,我将我的 Post 表与我的 businessPost 表连接起来以检索“isActive”列。当我打印出 Sequilize 返回的内容时,我看到我正在返回应该映射到 BusinessPostFormat 类型的数据对象:

post 
    dataValues: 
      postId: '188',
       postText: 'blah blah blah',
       user: 'userName',
       isActive: false ,

但是,当我在 graphiql 中执行查询时,isActive 字段返回为空。如果我可以看到解析器返回的正是 BusinessPostFormat 类型所期望的,我不明白为什么会发生这种情况?

解析器功能如下:

const resolvers = 
  Query: 
    businessUser(_, args) 
      return BusinessUser.findById(args.id);
    
,
BusinessUser: 
    posts(businessUser) 
      return businessUser.getPosts(
        attributes: 
          include: [[Sequelize.literal('business_posts.is_active'), 'isActive']],
          exclude: ['business_user_id']
        ,
        include: [ model: BusinessPost, attributes: ['is_active'] ]
      )
    ,
  

【问题讨论】:

【参考方案1】:

也许您错过了 Sequelize 使用实例 http://docs.sequelizejs.com/manual/tutorial/instances.html 的事实,而在这种情况下,这可能是缺少的事实。 像这样试试。

return Entries.findAll().then(entries => 
  return entries.map(e => e.get( plain: true ));
)

【讨论】:

哇,真的有效!你能向我解释为什么这有效吗?对于不使用连接的其他查询,它会产生类似的输出,并且解析器会正确返回。我的猜测是 Sequilize 在能够进行连接之前返回一个 post 实例?

以上是关于graphql.js:即使解析器正在为 sequilize 查询返回值,该字段仍为空的主要内容,如果未能解决你的问题,请参考以下文章

嵌套查询/解析器时的 GraphQL.js 订阅响应错误

即使添加了另一个反斜杠,JSON 解析器仍然在换行符上失败

GraphQL + 中继连接优化

argparse 解析器:覆盖选项

如何在 Graphql.js 中使用 GraphQL 订阅

C:使用fgetc()解析文件 - EOF无限循环