我有一个基本的酒吧在这里工作使用样板和图形-瑜伽:subscriptions subscriptions/tree/sql-lite
有一个公开的突变:
const Mutation = objectType({
name: 'Mutation',
definition(t) {
//...
t.field('publish', {
type: 'Post',
nullable: true,
args: {
id: idArg(),
},
resolve: async (parent, { id }, ctx) => {
const post = await ctx.photon.posts.update({
where: { id },
data: { published: true },
include: { author: true }
});
ctx.pubsub.publish("PUBLISHED_POST", {
publishedPost: post
});
return post
},
})
},
})还有一个订阅--我只是返回true以确保withFilter (来自graphql-yoga)正常工作。
const Subscription = objectType({
name: "Subscription",
definition(t) {
t.field("publishedPostWithEmail", {
type: "Post",
args: {
authorEmail: stringArg({ required: false })
},
subscribe: withFilter(
(parent, { authorEmail }, ctx) => ctx.pubsub.asyncIterator("PUBLISHED_POST"),
(payload, { authorEmail }) => true
)
});
}
});在publish上返回以下内容(您可以将它们复制并粘贴到代码框中--这很好!)
mutation {
publish(
id: "cjzwz39og0000nss9b3gbzb7v"
) {
id,
title,
author {
email
}
}
}subscription {
publishedPostWithEmail(authorEmail:"prisma@subscriptions.com") {
title,
content,
published
}
}{
"errors": [
{
"message": "Cannot return null for non-nullable field Subscription.publishedPostWithEmail.",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"publishedPostWithEmail"
]
}
],
"data": null
}由于某种原因,它正在返回data: null。当我在filter函数中记录payload.publishedPosts时,似乎所有东西都在那里。
{ id: 'cjzwqcf2x0001q6s97m4yzqpi',
createdAt: '2019-08-29T13:34:26.648Z',
updatedAt: '2019-08-29T13:54:19.479Z',
published: true,
title: 'Check Author',
content: 'Do you save the author?',
author:
{ id: 'sdfsdfsdfsdf',
email: 'prisma@subscriptions.com',
name: 'Prisma Sub' } }我遗漏了什么吗?
发布于 2019-08-30 23:19:38
终于弄明白了!
订阅函数需要以pubsub中的键命名。因此,如果您有如下所示的发布函数:
ctx.pubsub.publish("PUBLISHED_POST", {
publishedPost: post
});然后,您必须将订阅publishedPost命名为
t.field("publishedPost", {
type: "Post",
args: {
authorEmail: stringArg({ required: false })
},
subscribe: withFilter(
(parent, { authorEmail }, ctx) =>
ctx.pubsub.asyncIterator("PUBLISHED_POST"),
(payload, { authorEmail }) => payload.publishedPost.author.email === authorEmail
)
});如果将订阅命名为publishedPostWithEmail,则不返回任何数据。
t.field("publishedPostWithEmail", {
//...
});有趣的是,如果你有2把钥匙
ctx.pubsub.publish("PUBLISHED_POST", {
publishedPost2: post,
publishedPost3: post
});然后,如果您将订阅命名为publishedPost2,则将从结果中删除publishedPost3。
奇怪的是,如果你订阅了2条消息,你就会得到所有的数据。
ctx.pubsub.publish("PUBLISHED_POST", {
publishedPost: post,
publishedPost2: post
});
ctx.pubsub.publish("PUBLISHED_POST_X", {
publishedPostX: post,
publishedPostY: post
});ctx.pubsub.asyncIterator([
"PUBLISHED_POST",
"PUBLISHED_POST_X"
]),返回publishedPost、publishedPost2、publishedPostX、publishedPostY
因此,您可以通过订阅带有单个项的数组来解决上述问题,订阅的名称就变得无关紧要了。
t.field("publishedPostXYZ", {
type: "Post",
args: {
authorEmail: stringArg({ required: false })
},
subscribe: withFilter(
(parent, { authorEmail }, ctx) =>
ctx.pubsub.asyncIterator([
"PUBLISHED_POST"
]),
(payload, { authorEmail }) => {
return payload.publishedPost.author.email === authorEmail;
}
)
});所以看起来这可能是个错误
https://stackoverflow.com/questions/57714995
复制相似问题