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

时间:2016-10-21 17:45:46

标签: graphql apollo apollo-server

此解析器工作正常:

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 个答案:

答案 0 :(得分:2)

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

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

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