nodejs/vanilla 中的 Apollo-client 未触发订阅

Posted

技术标签:

【中文标题】nodejs/vanilla 中的 Apollo-client 未触发订阅【英文标题】:Subscription not triggering with Apollo-client in nodejs/vanilla 【发布时间】:2019-10-17 20:14:15 【问题描述】:

我正在使用 Apollo graphql 框架,似乎可以启动并运行订阅。但是我无法从订阅中触发任何事件,而且围绕 Apollo 客户端的文档很少涉及纯 nodejs 和 vanilla javascript

该项目正在为 node-red 制作几个节点,它将使用供应商的 graphql 接口来获取有关电力消耗和电价的不同数据。为此,我还需要使用订阅。对 graphql 很陌生,被推荐使用 apollo 框架。

result = tibber.getSubscription('subscription liveMeasurement(homeId:"c70dcbe5-4485-4821-933d-a8a86452737b")timestamp power maxPower accumulatedConsumption accumulatedCost');
// returns an Observable from the apollo client subscribe()
// client.subscribe( query: gql`$query` );

let sub = result.subscribe(
    next (data)  console.log(data); ,
    error (err)  console.log(err); 
  );

本以为 console.log 会在几秒钟后触发一些数据,因为此订阅适用于供应商 api explorer 上的演示帐户。 没有返回错误,订阅对象(子)处于“就绪”状态。

【问题讨论】:

subsription 会将更改从服务器“传递”到客户端,好吧,假设它可以工作(完成了一半)......但是什么会通知服务器某事发生了变化?缓存/轮询/发布订阅... fetch 是一次性事件,订阅需要蜜蜂'喂' 不确定我明白了...这是服务器上定义的订阅,因此设置为在更改和/或间隔(不是我的服务器)时中继信息。我有一个 websocket 链接,然后应该保持打开状态,并观察查询的变化(网络或缓存)。你的意思是我还需要 apollo 客户端来使它工作吗? 更多的是关于阿波罗服务器 - 你有什么触发/发送事件到这个(可能工作的)订阅(c-s)“频道”吗? 不是我的服务器,一个叫 Tibber 的供应商。但是,是的,它是他们架构中的有效订阅,使用他们的 API 资源管理器(数据正在定期流动)和我用于从我的客户进行测试的相同演示帐户令牌进行验证。 【参考方案1】:

我的建议:分而治之

我将从带有 apollo 客户端的标准反应应用程序开始。为简单起见,您可以使用 <Query/> 组件。这一步最重要的是熟悉authentication

下一步:直接使用客户端,不使用组件。仍在使用 react 使用 ApolloConsumer - 您的组件可以访问 client 道具。您可以使用从componentDidMount()console.logsetState)调用的client.query()

如果你更喜欢香草this tutorial可以更合适。

下一步将使用subscriptions。同样,从 <Subscription/> 组件开始。之后,您应该已经正确配置了客户端(传输、身份验证)。

在这一步,您将开始移动到节点 env,f.e.寻找像this 这样的例子并结合之前获得的知识。

【讨论】:

以上是关于nodejs/vanilla 中的 Apollo-client 未触发订阅的主要内容,如果未能解决你的问题,请参考以下文章

React/Apollo - 不同组件中的类似查询?

react-apollo-hooks 中的 useMutation 没有传递变量

如何将参数传递给 apollo 中的查询方法?

Apollo 中的 GraphQL 模式存在问题

NextJS 中的 Apollo 分页

将参数传递给 apollo 中的查询失败