RelayObservable:未处理的错误 TypeError:无法读取 React 和 Relay 中未定义的属性“订阅”

Posted

技术标签:

【中文标题】RelayObservable:未处理的错误 TypeError:无法读取 React 和 Relay 中未定义的属性“订阅”【英文标题】:RelayObservable: Unhandled Error TypeError: Cannot read property 'subscribe' of undefined in React and Relay 【发布时间】:2020-04-06 00:02:32 【问题描述】:

我已按照如何使用 GraphQL React + Relay (https://relay.dev/docs/en/subscriptions) 的订阅教程进行操作,但仍然无法正常工作。

我在我的应用程序中使用 Relay Modern 并且已成功集成查询但无法使用 requestSubscription 功能。

任何帮助都会很棒。

我的 environment.js 文件:

function setupSubscription(
  config,
  variables,
  cacheConfig,
  observer,
) 
  const query = config.text
  const subscriptionClient = new SubscriptionClient('ws://192.168.1.19:8000/subscriptions', reconnect: true);
  const id = subscriptionClient.on(query, variables, (error, result) => 
    console.log(result,'result');
    observer.onNext(data: result)
  )

const network = Network.create(fetchQuery, setupSubscription)

const environment = new Environment(
  network,
  store
);

export default environment;

- 我的 Subscription.js 文件:

const subscription = graphql`
      subscription newVoteSubscription 
        leaderboardUpdate 
          id,
          game_id,
          event_id,
          colarr,
          rowarr
        
      
    `;
    function newVoteSubscription(callback) 
      const variables = ;
      return requestSubscription(environment, 
        subscription: subscription,
        variables: variables,
        onError: (error)=> 
          console.log(error, "error");
        ,
        onNext: (res) => 
          console.log(res,'onNext');
          // callback();
        ,
        updater: proxyStore => 
          console.log(proxyStore,'proxyStore');
        ,
        onCompleted: () => 
          console.log('test');
        ,
      );
    

    export default newVoteSubscription;

【问题讨论】:

【参考方案1】:

我也遇到了网络问题。在 Relay 7 上使用 Observable 对我有用。这也处理错误情况和服务器关闭订阅。

const subscriptionClient = new SubscriptionClient('ws://192.168.1.19:8000/subscriptions', reconnect: true)

function setupSubscription(
  request,
  variables,
  cacheConfig,
) 
  const query = request.text;

  // Observable is imported from the relay-runtime package
  return Observable.create(sink => 
    const c = subscriptionClient.request( query, variables ).subscribe(sink);
    return c.unsubscribe;
  );

我不确定我为什么要使用接收器/取消订阅方法,但这对我有用。据我所知,relay 和subscriptions-transport-ws 使用的可观察类型不兼容。

我还建议您在setupSubscription 函数之外调用new SubscriptionClient(),否则您将为每个订阅请求打开一个新的WebSocket。

【讨论】:

我在外面调用了 new SubscriptionClient() 但返回如下错误:错误:无法找到本机实现,或 WebSocket 的替代实现! 哪个浏览器/操作系统? Chrome 和 Windows 10【参考方案2】:

我收到了响应,但现在observer.onNext 未定义。

我更新的代码 environment.js:

const setupSubscription = (config, variables, cacheConfig, observer) => 
  const query = config.text

  const subscriptionClient = new SubscriptionClient('ws://192.168.1.19:8000/subscriptions', reconnect: true)
  subscriptionClient.request( query, variables ).subscribe((result) => 
    observer.onNext(data: result)
  );

  return Observable.create(() =>     
    return subscriptionClient;
  );


const environment = new Environment(
  network: Network.create(fetchQuery, setupSubscription),
  store: new Store(new RecordSource())
);

【讨论】:

以上是关于RelayObservable:未处理的错误 TypeError:无法读取 React 和 Relay 中未定义的属性“订阅”的主要内容,如果未能解决你的问题,请参考以下文章

javascript 如果您发送WebHook的服务器以此JSON格式响应,则在处理阶段(而不是TY消息)后显示错误消息:

graphql dataloader 无法读取未定义错误的属性“加载”

错误处理

电子中的奇怪错误。未捕获的异常:TypeError [ERR_INVALID_ARG_TYPE]:“路径”

如何通过前端变量(Eleventy / 11ty)过滤处理过的文件?

在Ubuntu 16.10安装mysql workbench报未安装软件包 libpng12-0错误