标签: graphql-subscriptions

如何使用 graphql-subscriptions 处理断开连接事件

graphql-subscriptions用来管理会话(房间)。

我有像“聊天”这样的简单应用程序。

我可以使用以下方式发送消息进行聊天:

import { PubSub } from 'graphql-subscriptions';
...

pubSub.publish(triggerName, payload)
Run Code Online (Sandbox Code Playgroud)

我可以收听订阅事件..

但是我不知道如何在用户离开房间时正确处理(例如关闭完整浏览器)......

是否有任何“断开连接”事件?

我正在使用nestjs服务器并reactapollo-link-ws

谢谢你们。

websocket graphql graphql-subscriptions nestjs

5
推荐指数
0
解决办法
643
查看次数

开玩笑:await vs setImmediate vs useFakeTimers vs new Promise(setImmediate)

以下是 TypeScript 中的 Jest 测试。我想知道为什么需要 setImmediate() 。

第一个例子是一个有效的测试。接下来是我尝试过但不起作用的各种事情。我不明白发生了什么事。pubsub.publish 的签名是: (method) PubSub.publish(triggerName: string, payload: any): Promise<void>

  test.only('subscriptions', async () => {
    const document = parse(`
      subscription {
        create 
      }
    `)

    const sub = <AsyncIterator<ExecutionResult>>await subscribe(schema, document);

    expect(sub.next).toBeDefined()

    // setInterval and process.nextTick also work here:
    setImmediate(() => pubsub.publish('CREATE_ONE', { create: "FLUM!" }))  // this works


    const { value: { errors, data } } = await sub.next()

    expect(errors).toBeUndefined()
    expect(data).toBeDefined()
    expect(data.create).toBe('FLUM!')
  }, 10000)
Run Code Online (Sandbox Code Playgroud)

这些是我尝试过的其他事情,其中​​一些是在研究了类似问题的答案之后做出的。所有这些尝试都会失败,并在测试中出现超时异常:



  test.only('subscriptions', async () => {
  // attempt #1: jest.useFakeTimers()

    const …
Run Code Online (Sandbox Code Playgroud)

typescript jestjs setimmediate graphql-subscriptions

5
推荐指数
1
解决办法
1574
查看次数

在 Angular 聊天组件中使用 apollos subscribeToMore 方法进行订阅时,出现未处理的 GraphQL 订阅错误

问题描述

我有一个 Angular 聊天组件,它通过 graphql 查询从后端获取消息。在同一查询中,当通过 graphql 突变添加新消息时,我订阅更新。

消息订阅被编码为聊天组件的方法,以便我可以在组件首次呈现时在角度生命周期方法中调用它。

这是根据 apollo 中的文档进行订阅的通常设置: https: //apollo-angular.com/docs/data/subscriptions

当我调用编码了订阅的方法时,出现以下错误:

“无法从另一模块或领域使用 GraphQLSchema“[object GraphQLSchema]”。确保 node_modules 目录中只有一个“graphql”实例。如果不同版本的“graphql”是其他依赖模块的依赖项,请使用“分辨率”,以确保只安装一个版本。https: //yarnpkg.com/en/docs/selective-version-resolutions 不能同时使用重复的“graphql”模块,因为不同版本可能具有不同的功能和行为。函数中使用的一个版本的数据可能会产生令人困惑和虚假的结果。”

我知道错误来自该方法的调用,当我注释掉该调用时,错误就消失了。订阅不会查询后端,因此我知道问题出在客户端。

预期行为

当用户在聊天中发送新消息时,服务器会收到订阅解析器(服务器端)发生消息更新的通知,它将实时将所有消息回传到前端,并且消息应该是通过订阅更多方法返回。

我为解决这个问题所采取的步骤

我尝试查看这个问题: 无法使用重复的“graphql”模块

这让我找到了这个链接: https://github.com/graphql/graphql-js/issues/491

对于使用yarn作为包管理器的人来说,有一个解决方法,但这并不关心我,因为我使用npm。

我认为可能存在重复的 graphql 模块,因此我尝试清理 package.json 文件,删除节点模块并重新安装它们,但这不起作用。

代码示例

聊天组件

import { Component, OnInit } from '@angular/core';
import { Apollo, QueryRef, gql } from 'apollo-angular';

const MESSAGES_SUBSCRIPTION = gql`
   subscription {
     messagesAdded {
      id
      content
      user
    }
  }
`;

const GET_MESSAGES = gql`
   query messages{
     messages {
      id
      content
      user
    }
  } …
Run Code Online (Sandbox Code Playgroud)

javascript graphql graphql-subscriptions angular apollo-angular

5
推荐指数
1
解决办法
1178
查看次数

我可以使用 Insomnia REST 客户端连接到 GraphQL 订阅吗?

Insomnia 现在支持 WebSocket。因此,我希望我也可以使用它来测试 GraphQL 订阅,因为它们也使用 WebSocket。

我创建了一个 GraphQL 请求来打开新的订阅,但我总是收到以下响应:

{
    "errors": [
        {
            "message": "The response type is not supported."
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我是否做错了什么,或者 GraphQL 订阅根本不是 Insomnia 中的一个功能?

我检查了Insomnia WebSocket 文档以及Insomnia GraphQL 查询文档,但找不到有关此主题的任何信息。

graphql graphql-subscriptions insomnia

5
推荐指数
1
解决办法
1146
查看次数

4
推荐指数
1
解决办法
1990
查看次数

如何在 graphql-playground(订阅)中更改 websocket url

我想更改graphql中的graphql websocket端点,有人知道怎么做吗?

默认情况下它ping

wss://localhost/graphql
Run Code Online (Sandbox Code Playgroud)

我需要将其更改为 pusher url

谢谢 :-)

graphql graphql-subscriptions

4
推荐指数
1
解决办法
2398
查看次数

在 next.js api 路由中使用订阅的 Apollo 服务器:websockets 问题

我尝试在 next.js 9.x 应用程序中设置 GraphQL 订阅。该应用程序完全是假的,仅用于尝试 Apollo Server 订阅。“数据库”只是一个数组,我将新用户推送到它。

这是我到目前为止得到的代码。

import { ApolloServer, gql, makeExecutableSchema } from "apollo-server-micro"
import { PubSub } from "apollo-server"

const typeDefs = gql`
  type User {
    id: ID!
    name: String
    status: String
  }


  type Query {
    users: [User!]!
    user(id: ID!): User
  }

  type Mutation {
    addUser(id: String, name: String, status: String): User
  }

  type Subscription {
    newUser: User!
  }
`

const fakedb = [
  {
    id: "1",
    name: "myname",
    status: "active",
  },
]

const NEW_USER …
Run Code Online (Sandbox Code Playgroud)

apollo-server graphql-subscriptions next.js

4
推荐指数
3
解决办法
1711
查看次数

提高 Hasura 订阅性能

我们开发了一个依赖于用户之间实时交互的网络应用程序。我们使用 Angular 作为前端,使用 Hasura 和 Postgres 上的 GraphQL 作为后端。我们注意到,当超过 300 个用户同时活跃时,我们会遇到严重的性能损失。
因此,我们希望改进我们的订阅设置。
我们认为可能的问题可能是:

  1. 订阅过多
  2. 订阅太大且复杂,订阅中有太多分叉

关于 1. 每个用户在使用 Web 应用程序时大约有 5-10 个活跃订阅。关于 2. 我们的订阅很复杂,因为我们将最多 6 个表连接在一起。

我们想到的解决方案:

  1. 使用更多查询并限制在完全需要实时的字段上使用订阅。
  2. 将复杂的查询/订阅拆分为多个较小的查询/订阅。

    我们是否遗漏了另一个可能的原因?我们还可以使用什么来提高整体性能?

    谢谢您的意见!

postgresql graphql graphql-subscriptions hasura

4
推荐指数
1
解决办法
1437
查看次数

Apollo 订阅 - Nextjs - 错误:Observable 在 Concast.removeObserver 过早取消

我正在尝试在我的 nextjs 项目中使用 apollo/graphql 订阅,我的 graphql 服务器放置在外部 nextjs 服务中,我可以毫无问题地处理查询和突变,但是当我使用 useSubscription 的实现时,我收到以下错误:

“错误:Observable 在 eval (webpack-internal: ///../../node_modules/@apollo/client/utilities/observables/Concast.js:21:47) 在 cleanupSubscription (webpack-internal:///../../node_modules/zen-observable- ts/module.js:92:7) 在 Subscription.unsubscribe (webpack-internal:///../../node_modules/zen-observable-ts/module.js:207:7) 在 cleanupSubscription (webpack-internal) :///../../node_modules/zen-observable-ts/module.js:97:21) 在 Subscription.unsubscribe (webpack-internal:///../../node_modules/zen-observable- ts/module.js:207:7) 在 eval (webpack-internal:///../../node_modules/@apollo/client/react/hooks/useSubscription.js:106:26) 在 safeCallDestroy (webpack-内部:///../../node_modules/react-dom/cjs/react-dom.development.js:22763:5)在commitHookEffectListUnmount(webpack-internal:///../../node_modules/react -dom/cjs/react-dom.development.js:22927:11) 在 invokePassiveEffectUnmountInDEV (webpack-internal:///../../node_modules/react-dom/cjs/react-dom.development.js:24998 :13) 在 invokeEffectsInDev (webpack-internal:///../../node_modules/react-dom/cjs/react-dom.development.js:27137:11) 在 commitDoubleInvokeEffectsInDEV (webpack-internal:///. ./../node_modules/react-dom/cjs/react-dom.development.js:27110:7) 在flushPassiveEffectsImpl (webpack-internal:///../../node_modules/react-dom/cjs/react -dom.development.js:26860:5) 在flushPassiveEffects (webpack-internal:///../../node_modules/react-dom/cjs/react-dom.development.js:26796:14) 在eval ( webpack-internal:///../../node_modules/react-dom/cjs/react-dom.development.js:26592:9) 在 workLoop (webpack-internal:///../../node_modules /scheduler/cjs/scheduler.development.js:266:34)在flushWork(webpack-internal:///../../node_modules/scheduler/cjs/scheduler.development.js:239:14)在MessagePort。 PerformWorkUntilDeadline(webpack-internal:///../../node_modules/scheduler/cjs/scheduler.development.js:533:21)”

我知道订阅服务器工作正常,因为我可以从 apollo studio 收听,并且我已经使用 create-react-app 创建了一个水疗中心,并且工作正常

我用过了:

服务器:

  • "apollo-server-express": "^3.6.7"
  • “graphql-ws”:“^5.7.0”

客户

  • “下一个”:“^12.1.5”
  • "@apollo/client": "^3.5.10"
  • “graphql-ws”:“^5.7.0”

钩子实现

node.js graphql-subscriptions next.js apollo-client

4
推荐指数
1
解决办法
1375
查看次数

如何根据某个对象的 id 过滤订阅事件?

我希望能够根据对象 ID 过滤某些操作的订阅。例如我想做这样的事情:

subscription{
  onTaskCompleted(taskId: "1"){
    taskCompleted{
      status
      items{
        reason
        iD
      }
    }
    taskFailed{
      status
      details{
        detail
        status        
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

仅当 ID 为“1”的任务完成时才会发出该事件。

是否有一种内置的方法可以HotChocolate使用某种类型的过滤来做到这一点?

或者

我是否必须自己添加这种类型的过滤,通过在解析器中执行类似的操作:

if(_taskIds.Contains(taskId))
{
   TaskCompletedExecution taskFinished = new TaskCompletedExecution(taskCompleted);
   await eventSender.SendAsync(nameof(TaskListSubscriptions.OnTaskCompleted), taskFinished, 
   cancellationToken);
}
Run Code Online (Sandbox Code Playgroud)

谢谢

graphql graphql-subscriptions hotchocolate

2
推荐指数
1
解决办法
525
查看次数