实时消息删除订阅返回空

问题描述 投票:0回答:1

我目前正在致力于在 GraphQL 应用程序中实现实时消息删除。我已经设置了必要的突变和订阅解析器,但我遇到了一个问题,即 messageDeleted 订阅返回 null,尽管消息对我来说已被删除,但我希望删除消息时,其他用户可以在前端看到此消息。

GraphQL 架构和解析器:

mutation

    deleteMessage: async (_, { messageId }) => {
      const message = await Message.query().findById(messageId).first()

      if (!message) {
        throw new Error('Message not found')
      }

      const pubsub = await getPubsub()

      await Message.query().deleteById(messageId)

      // Broadcast the deleted message ID to subscribers
      pubsub.publish(`${MESSAGE_DELETED}.${message.channelId}`, messageId)

      console.log(messageId,"messageId")
      return { success: true }
    },

subscription:

   messageDeleted: {
      resolve: async (messageId, _, context) => {
        const message = await Message.query()
          .findById(messageId)
          .withGraphJoined('user')

        return message
      },
      subscribe: async (_, vars) => {
        const pubsub = await getPubsub()
        return pubsub.asyncIterator(`${MESSAGE_DELETED}.${vars.channelId}`)
      },
    },






 type Message {
    content: String
    user: User
    id: String
    created: DateTime
    updated: DateTime
  }
extend type Subscription {
    messageDeleted(channelId: ID): Message
  }

成功获取messageId和channelId,但在客户端却获取

subscriptionData.data
null 为什么?

这是我的客户端 messageContainer.js

const MESSAGE_DELETED_SUBSCRIPTION = gql`
  subscription messageDeleted($channelId: ID) {
    messageDeleted(channelId: $channelId) {
      id
      content
    }
  }
`
const subscribeToMessageDeleted = (subscribeToMore, channelId) =>
  subscribeToMore({
    document: MESSAGE_DELETED_SUBSCRIPTION,
    variables: { channelId },
    updateQuery: (prev, { subscriptionData }) => {
      if (!subscriptionData.data) return prev
      console.log(subscriptionData, 'subscriptionData')
      const messageId = subscriptionData.data // Access the message ID directly
      // eslint-disable-next-line no-console
      console.log(messageId, 'messageId')

      // Filter out the deleted message from the messages list
      const updatedEdges = prev.messages.edges.filter(
        ({ id }) => id !== messageId,
      )

      return {
        ...prev,
        messages: {
          ...prev.messages,
          edges: updatedEdges,
        },
      }
    },
  })

如果您需要更多信息或帮助来解决此问题,请告诉我。谢谢!

node.js reactjs graphql publish-subscribe
1个回答
0
投票

这可能是因为您如何从客户端的订阅有效负载访问数据。在订阅解析器中,您将从 messageDeleted 订阅中返回已删除的消息,但在客户端,您尝试使用 subscriptionData.data 访问数据。您应该使用 subscriptionData.data.messageDeleted.id 访问已删除的消息 ID。你可以尝试这样的事情,

const subscribeToMessageDeleted = (subscribeToMore, channelId) =>
subscribeToMore({
  document: MESSAGE_DELETED_SUBSCRIPTION,
  variables: { channelId },
  updateQuery: (prev, { subscriptionData }) => {
    if (!subscriptionData.data) return prev
    const deletedMessage = subscriptionData.data.messageDeleted
    if (!deletedMessage) return prev

    // Filter out the deleted message from the messages list
    const updatedEdges = prev.messages.edges.filter(
      ({ id }) => id !== deletedMessage.id,
    )

    return {
      ...prev,
      messages: {
        ...prev.messages,
        edges: updatedEdges,
      },
    }
  },
})
© www.soinside.com 2019 - 2024. All rights reserved.