GraphQL/Prisma 订阅仅针对 DELETE 触发
Posted
技术标签:
【中文标题】GraphQL/Prisma 订阅仅针对 DELETE 触发【英文标题】:GraphQL/Prisma Subscriptions only fire for DELETE 【发布时间】:2019-01-24 05:41:12 【问题描述】:我已经使用 Prisma 建立了一个项目,用于处理与服务器之间的数据通信/存储/检索。它与example 的架构基本相同。唯一的主要区别是我的解析器没有分成不同的文件,它们都驻留在 index.js 中。
现在,我正在尝试实现订阅,这将捕获对我的模型的所有更改。但在我的一生中,除了 DELETE 操作之外,我无法订阅触发任何其他操作。我已经阅读了多个论坛帖子和示例,但问题仍然存在。
我的 index.js 订阅解析器如下所示:
Subscription:
userChanges:
subscribe: (_, args, context, info) =>
console.log("CHECKCHECK");
return context.prisma.subscription.user(
where: mutation_in: ['CREATED'] ,
info
)
,
taskChanges:
subscribe: async (_, args, context, info) =>
return await context.prisma.subscription.task(, info)
我的 schema.graphql 看起来像这样:
# import Task, User from '../generated/prisma.graphql'
# import TaskSubscriptionPayload, UserSubscriptionPayload from '../generated/prisma.graphql'
type Query
task(id: ID!): Task
tasks: [Task]!
user(id: ID!): User
users: [User!]
getUserTasks(id:ID!): [Task]!
type Mutation
addTask(
name: String!,
priority: Float!,
weight: Int!,
best: Float!,
expected: Float!,
worst: Float!,
calculated: Float!,
stdDev: Float!,
actualTime: Float,
tags: [String!]!,
ownedBy: ID!
): Task!
updateTask(
id: ID!,
name: String!,
priority: Float!,
weight: Int!,
best: Float!,
expected: Float!,
worst: Float!,
calculated: Float!,
stdDev: Float!,
actualTime: Float,
tags: [String!]!,
ownedBy: ID!
): Task!
deleteTask(id: ID!): Task!
addNewUser(name: String!): User!
deleteUser(id:ID!): User!
type Subscription
taskChanges: TaskSubscriptionPayload
userChanges: UserSubscriptionPayload
我一定是遗漏了一些东西,因为我在 Prisma 论坛上发现的任何/所有问题都已在 3 月份通过修复得到解决。我怀疑这可能与 Async prisma 绑定有关,但这只是直觉。
任何帮助将不胜感激。
谢谢,
一个
【问题讨论】:
您是否检查过订阅是否在 Prisma 服务器上触发?这就是我开始调试的方式,以确定这是否是 应用层(graphql-yoga
和 prisma-binding
)或底层 Prisma 服务的问题。您可以通过为 Prisma API 打开 Playground 并直接在那里测试 user
订阅来验证这一点(而不是从应用层测试您的 taskChanges
和 userChanges
订阅)。
作为参考,您可能需要查看此示例:github.com/prisma/prisma/tree/master/examples/subscriptions 此外,本教程详细讨论了订阅:prisma.io/docs/tutorials/build-graphql-servers/development/…
我的解析器中的 console.log 确实会触发,但只有在我第一次订阅时才会触发一次,所以我知道它至少已经到了那么远。当我在 Playground 中通过在 App 或 Prisma 服务器上进行订阅来测试它时,我得到了相同的结果,它只会在 DELETE 时触发。
我还尝试按照上面 nburk 链接的示例实现我的解析器。没有运气。结果还是一样。
所以 CREATE 或 UPDATE 订阅也不会在 Prisma API 中触发?如果是这种情况,请打开一个问题here。理想情况下,使用最小示例来重现问题(示例可能只是带有应用层代码的 Prisma API)。
【参考方案1】:
好的,所以我在反复试验后解决了这个问题。看来我遵循的初始教程使用了旧版本的 primsagraphql/prisma 图像,需要更新。
要解决此问题,请执行以下操作:
使用更新的版本编辑您的 docker-compose.yml(对我来说,我从 1.12 升级到 1.14)
services:
prisma:
image: prismagraphql/prisma:1.14
让您的 docker 镜像离线,然后重新部署它们。对我来说,我很高兴使用以下命令完全杀死它们,但是如果您想保存数据,您可能需要找到一组不同的命令来执行此操作。
docker-compose kill
docker-compose down
docker-compose up -d
让您新部署的 Docker 映像预热一下。由于某种原因,我的需要几秒钟才能醒来:P。之后,您应该会发现您的订阅将再次按预期工作。
希望这对其他人有所帮助,我确实花了一段时间才弄清楚我需要更新我的 Docker 映像而不是我的 prisma npm 版本。
干杯,
一个
【讨论】:
以上是关于GraphQL/Prisma 订阅仅针对 DELETE 触发的主要内容,如果未能解决你的问题,请参考以下文章
Apollo / GraphQL / Prisma“登录”突变不会返回所有用户字段