首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >prisma2订阅返回数据: null

prisma2订阅返回数据: null
EN

Stack Overflow用户
提问于 2019-08-29 17:11:48
回答 1查看 624关注 0票数 0

我有一个基本的酒吧在这里工作使用样板和图形-瑜伽:subscriptions subscriptions/tree/sql-lite

有一个公开的突变:

代码语言:javascript
复制
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)正常工作。

代码语言:javascript
复制
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上返回以下内容(您可以将它们复制并粘贴到代码框中--这很好!)

代码语言:javascript
复制
mutation {
  publish(
    id: "cjzwz39og0000nss9b3gbzb7v"
  ) {
    id,
    title,
    author {
      email
    }
  }
}
代码语言:javascript
复制
subscription {
  publishedPostWithEmail(authorEmail:"prisma@subscriptions.com") {
    title,
    content,
    published
  }
}
代码语言:javascript
复制
{
  "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时,似乎所有东西都在那里。

代码语言:javascript
复制
{ 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' } }

我遗漏了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-30 23:19:38

终于弄明白了!

订阅函数需要以pubsub中的键命名。因此,如果您有如下所示的发布函数:

代码语言:javascript
复制
ctx.pubsub.publish("PUBLISHED_POST", {
          publishedPost: post
        });

然后,您必须将订阅publishedPost命名为

代码语言:javascript
复制
        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,则不返回任何数据。

代码语言:javascript
复制
        t.field("publishedPostWithEmail", {
                //...
        });

有趣的是,如果你有2把钥匙

代码语言:javascript
复制
ctx.pubsub.publish("PUBLISHED_POST", {
          publishedPost2: post,
          publishedPost3: post
        });

然后,如果您将订阅命名为publishedPost2,则将从结果中删除publishedPost3

奇怪的是,如果你订阅了2条消息,你就会得到所有的数据。

代码语言:javascript
复制
ctx.pubsub.publish("PUBLISHED_POST", {
          publishedPost: post,
          publishedPost2: post
        });
        ctx.pubsub.publish("PUBLISHED_POST_X", {
          publishedPostX: post,
          publishedPostY: post
        });
代码语言:javascript
复制
ctx.pubsub.asyncIterator([
                        "PUBLISHED_POST",
                        "PUBLISHED_POST_X"
                    ]),

返回publishedPostpublishedPost2publishedPostXpublishedPostY

因此,您可以通过订阅带有单个项的数组来解决上述问题,订阅的名称就变得无关紧要了。

代码语言:javascript
复制
        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;
                }
            )
        });

所以看起来这可能是个错误

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57714995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档