es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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' })
            },
        }
    }
},

Imagen

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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay algunas cosas que verificar para solucionar por qué tus suscripciones de GraphQL no están enviando ninguna actualización:

    1. Asegúrate de que tu servidor de Redis esté en ejecución y accesible desde tu servidor backend.
    2. 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 ser countPendingInquires.

    3. Verifica que el método publish se esté llamando correctamente y con el nombre del evento correcto. En tu caso, deberías llamar a pubsub.publish('countPendingInquires', { PendingInquires: {...} }).

    4. Verifica en el lado del cliente que tu smartQuery se suscriba correctamente al evento pendingInquires y esté recibiendo datos. Puedes verificar esto revisando la consola del navegador en busca de cualquier salida de console.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 como graphql-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 resolutor subscribe para enviarlo a tus suscriptores.

Comments are closed.