我目前正在致力于在 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,
},
}
},
})
如果您需要更多信息或帮助来解决此问题,请告诉我。谢谢!
这可能是因为您如何从客户端的订阅有效负载访问数据。在订阅解析器中,您将从 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,
},
}
},
})