我graphql-subscriptions
用来管理会话(房间)。
我有像“聊天”这样的简单应用程序。
我可以使用以下方式发送消息进行聊天:
import { PubSub } from 'graphql-subscriptions';
...
pubSub.publish(triggerName, payload)
Run Code Online (Sandbox Code Playgroud)
我可以收听订阅事件..
但是我不知道如何在用户离开房间时正确处理(例如关闭完整浏览器)......
是否有任何“断开连接”事件?
我正在使用nestjs
服务器并react
与apollo-link-ws
谢谢你们。
以下是 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) 我有一个 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 文件,删除节点模块并重新安装它们,但这不起作用。
Run Code Online (Sandbox Code Playgroud)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 } } …
javascript graphql graphql-subscriptions angular apollo-angular
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 SPQR 库实现 GraphQL 的订阅功能?
我想更改graphql中的graphql websocket端点,有人知道怎么做吗?
默认情况下它ping
wss://localhost/graphql
Run Code Online (Sandbox Code Playgroud)
我需要将其更改为 pusher url
谢谢 :-)
我尝试在 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) 我们开发了一个依赖于用户之间实时交互的网络应用程序。我们使用 Angular 作为前端,使用 Hasura 和 Postgres 上的 GraphQL 作为后端。我们注意到,当超过 300 个用户同时活跃时,我们会遇到严重的性能损失。
因此,我们希望改进我们的订阅设置。
我们认为可能的问题可能是:
关于 1. 每个用户在使用 Web 应用程序时大约有 5-10 个活跃订阅。关于 2. 我们的订阅很复杂,因为我们将最多 6 个表连接在一起。
我们想到的解决方案:
我正在尝试在我的 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 创建了一个水疗中心,并且工作正常
我用过了:
服务器:
客户
钩子实现
我希望能够根据对象 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 ×7
next.js ×2
angular ×1
graphql-java ×1
graphql-spqr ×1
hasura ×1
hotchocolate ×1
insomnia ×1
javascript ×1
jestjs ×1
nestjs ×1
node.js ×1
postgresql ×1
setimmediate ×1
typescript ×1
websocket ×1