¿Por qué no estoy recibiendo actualizaciones de mi suscripción?
Estoy tratando de configurar las Subscriptions
de GraphQL, pero parece que se conecta al backend pero no envía ninguna actualización.
En el frontend, estoy utilizando Nuxt 2
y así es como estoy intentando hacerlo funcionar:
Esta es mi consulta de prueba
export const pendingInquiresSubscription = () => {
return gql`
subscription PendingInquires {
countPendingInquires {
amount
}
}`
}
Mi smartQuery en el componente de página
apollo: {
$subscribe: {
pendingInquires: {
query: pendingInquiresSubscription(),
result({ data, loading }) {
this.loading = loading;
console.log(data)
},
error(err) {
this.$notify({ message: `Something went wrong while trying to update the count of new inquiries: ${err.message}`, type: 'error' })
},
}
}
},
Backend:
Mi pubsub
import { RedisPubSub } from 'graphql-redis-subscriptions';
import Redis from 'ioredis';
const REDIS_DOMAIN_NAME = '127.0.0.1'
const PORT_NUMBER = 6379
const options = {
host: REDIS_DOMAIN_NAME,
port: PORT_NUMBER,
retryStrategy: (times: any) => {
return Math.min(times * 50, 2000);
}
}
export const pubsub = new RedisPubSub({
publisher: new Redis(options),
subscriber: new Redis(options)
})
Mi esquema
extend type Subscription {
countPendingInquires: PendingInquires!
}
type PendingInquires {
amount: Int!
}
Mi resolver
...
Subscription: {
countPendingInquires: {
subscribe: () => pubsub.asyncIterator(['countPendingInquires'])
},
},
...
Así es como estoy intentando enviar el evento:
pubsub.publish('countPendingInquires', {
PendingInquires: {
amount: await TelegramInguireModel.find({ }).countDocuments()
}
})
También me pregunto si hay alguna forma incorporada de establecer el estado inicial para las suscripciones.
davy.ai
Hay algunas cosas que verificar para solucionar por qué tus suscripciones de GraphQL no están enviando ninguna actualización:
Verifica nuevamente que tu resolutor
subscribe
esté devolviendo correctamente un iterador asíncrono con el nombre del evento correcto. En tu caso, el nombre del evento debería sercountPendingInquires
.Verifica que el método
publish
se esté llamando correctamente y con el nombre del evento correcto. En tu caso, deberías llamar apubsub.publish('countPendingInquires', { PendingInquires: {...} })
.Verifica en el lado del cliente que tu
smartQuery
se suscriba correctamente al eventopendingInquires
y esté recibiendo datos. Puedes verificar esto revisando la consola del navegador en busca de cualquier salida deconsole.log(data)
.En cuanto a establecer el estado inicial para las suscripciones, no hay una forma integrada de hacer esto con el paquete
graphql-subscriptions
. Sin embargo, algunas implementaciones del servidor GraphQL comographql-yoga
ofrecen esta funcionalidad a través de objetos de contexto personalizables. Podrías almacenar el estado inicial en el contexto y recuperarlo en el resolutorsubscribe
para enviarlo a tus suscriptores.