Apollo:订阅与查询解析器之间的区别?

Posted

技术标签:

【中文标题】Apollo:订阅与查询解析器之间的区别?【英文标题】:Apollo: Difference Between Subscription vs Query Resolvers? 【发布时间】:2017-03-04 02:48:44 【问题描述】:

这个解析器工作正常:

const resolvers = 
    Query: 
        instant_message(_, args) 
            var ret = connectors.IM.findAll( where: args ).then((res) => res.map((item) => item.dataValues));
            return ret;
        
    ,
    Subscription: 
    //[.....]
        ,
    

;

订阅解析器与查询解析器使用完全相同的代码是否有意义?即:

const resolvers = 
    Query: 
        instant_message(_, args) 
            var ret = connectors.IM.findAll( where: args ).then((res) => res.map((item) => item.dataValues));
            return ret;
        
    ,
    Subscription: 
        instant_message(_, args) 
            var ret = connectors.IM.findAll( where: args ).then((res) => res.map((item) => item.dataValues));
            return ret;
        
    

;

如果不是,需要什么区别?提前感谢大家提供任何信息。

【问题讨论】:

【参考方案1】:

是的,如果您希望在订阅结果中收到与在查询结果中收到的相同数据,那么采用相同的逻辑是有意义的。在这种情况下,分享实际的实现可能是有意义的:

// Used in both query and subscription field
function instant_message(root, args) 
  return connectors.IM.findAll( where: args ).then((res) => res.map((item) => item.dataValues));


const resolvers = 
    Query: 
        instant_message,
    ,
    Subscription: 
        instant_message,
    ,
;

查询和订阅之间的最大区别在于订阅可能会从发布-订阅消息中接收附加信息。例如,在 GitHunt 示例中,我们有一个 commentAdded 订阅解析器,它使用来自 pub-sub 有效负载的数据并且根本不访问数据库:https://github.com/apollostack/GitHunt-API/blob/cc67a4506c31310b4ba8d811dda11d258c7d60d6/api/schema.js#L166-L171

【讨论】:

以上是关于Apollo:订阅与查询解析器之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

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

TypeORM Apollo 嵌套查询解析器

如何使用 apollo / graphql 实现节点查询解析器

Apollo 链路状态默认解析器不工作(@client 查询参数变量)

Apollo GraphQL:未在突变子字段上调用解析器

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