Creé una función en mi backend de NodeJS que tiene el propósito de volver a intentar 10 veces una solicitud si un valor en la primera solicitud es igual a nulo. Este comportamiento es necesario porque hay una función de trabajador que sube PDF a AWS, por lo que el valor que estoy recuperando con la nueva función contiene una URL de PDF que muy a menudo en la primera solicitud es nula.
El objetivo es verificar primero si tenemos el pdfUrl si eso no es NULL para devolver los datos.
Si pdfURL por algún motivo es NULL, entonces la función debe volver a intentar la solicitud con un tiempo de espera de 20 s y un máximo de 10 reintentos.
La función que probé es la siguiente y tiene varios problemas:
async function getIcfDocument(documentId, { log }) { log.info('Getting IcfDocument with last revision pdfUrl'); const MAX_RETRIES = 10; const timeout = 20000; let data; for (let i = 0; i <= MAX_RETRIES; i += 1) { try { const { icfDocuments } = await request( CONSENT_SERVICE_URL, getICFDocumentRecipientsQuery, { documentId, } ); if (icfDocuments.nodes[0].revision.pdfUrl) { log.info('Success the revision pdfUrl is present'); data = icfDocuments; } else { log.debug( 'Waiting to retrieve the last revision pdfUrl %s ms', timeout ); await sleep(timeout); log.debug('Retrying times %s', i); } } catch (err) { log.error( 'Failed to retrieve the data for document %s, Error: %s', documentId, err.message ); return null; } } return data; }Será bueno ver una mejor manera de lo que he intentado, ya que tengo algunas dificultades para hacerlo.
El método de solicitud anterior solicita a una consulta GQL por qué se implementó de esta manera
const { icfDocuments } = await request( CONSENT_SERVICE_URL, getICFDocumentRecipientsQuery, { documentId, } ); El icfDocuments es el OBJ resultante de la consulta que contiene el urlPdf y otra información. Esta consulta debe volver a intentarse si esa URL es nula durante un máximo de 10 veces y 20 s de tiempo de espera entre solicitudes.
La consulta es esta como info
const getICFDocumentRecipientsQuery = gql` query GetICFDocumentRecipients($documentId: ID!) { icfDocuments(filter: { ids: [$documentId] }, pagination: { limit: 1 }) { nodes { id recipients { id email phone locale } revision { pdfUrl } } } } `; async function getIcfDocument(documentId, { log }) { log.info('Getting IcfDocument with last revision pdfUrl'); const MAX_RETRIES = 10; const timeout = 20000; for (let i = 0; i <= MAX_RETRIES; i++) { try { const { icfDocuments } = await request( CONSENT_SERVICE_URL, getICFDocumentRecipientsQuery, { documentId, } ); if (icfDocuments.nodes[0].revision.pdfUrl) { log.info('Success the revision pdfUrl is present'); return data; // SOLUTION TO #1 } else { if (i == MAX_RETRIES) return log.error('Failed to retrieve pdfUrl after %s tries.', MAX_RETRIES); // SOLUTION TO #2 log.debug( 'Waiting to retrieve the last revision pdfUrl %s ms', timeout ); await sleep(timeout); log.debug('Retrying times %s', i); } } catch (err) { log.error( 'Failed to retrieve the data for document %s, Error: %s', documentId, err.message ); break; } } return null; }