Recientemente, por alguna razón desconocida, comencé a ver errores regulares en la consola. Como esto:
(node:147) UnhandledPromiseRejectionWarning: Error: timeout of 1000ms exceeded at createError (/home/runner/ricebot/node_modules/axios/lib/core/createError.js:16:15) at RedirectableRequest.handleRequestTimeout (/home/runner/ricebot/node_modules/axios/lib/adapters/http.js:280:16) at RedirectableRequest.emit (events.js:314:20) at RedirectableRequest.EventEmitter.emit (domain.js:483:12) at Timeout._onTimeout (/home/runner/ricebot/node_modules/follow-redirects/index.js:166:12) at listOnTimeout (internal/timers.js:554:17) at processTimers (internal/timers.js:497:7)A veces también hace que la latencia de mi bot vaya a 30000 ms.
Solo tengo partes de Axios en mis comandos divertidos y aquí hay uno de ellos (sin embargo, todavía funciona correctamente, solo registra el error):
const url = 'https://no-api-key.com/api/v2/animals/cat'; let image; let fact; try { const { data } = await axios.get(url); console.log(data); image = data.image; fact = data.fact; } catch (e) { console.log(e) return message.channel.send('An error occured, please try again!'); }Esto no solía ser una cosa.
Dado que su llamada axios no tiene captura, es normal recibir este error o advertencia.
Es importante administrar las solicitudes de axios para evitar este tipo de problemas. Además, supongo que a la muestra que muestra le faltan algunos datos porque no necesitará definir variables de resultado fuera del estado de captura, por lo que supongo que tiene un bucle o algo que también puede causar esto.
Si está realizando llamadas al mismo punto final en un bucle o con Promise.all, a veces necesita limitar las solicitudes simultáneas. Si no es el caso, ignore esta parte.
En primer lugar, asegúrese de configurar su valor axios.default.timeout correctamente para definir cuándo cancelar la solicitud si hubo respuesta.
Defina un estado de respuesta, verifique su con sus requisitos.
function checkStatus(response) { if (response.status >= 200 && response.status < 300) { return response; } const error: any = new Error(response.statusText); error.response = response; throw error; }Defina un código de análisis para asegurarse de tener siempre la misma estructura.
function parseJSON(response) { return response.data; }Defina una funcionalidad de captura para verificar errores y decidir si arrojar errores o simplemente registrarlos.
function catchError(e){ console.error(e); // TODO send a message return null; }Usémoslos en una sola llamada con .catch.
const myResult = await axios.get(url) .then(checkStatus) .then(parseJSON) .catch(catchError); console.log(myResult);si no me equivoco, no puede acceder a las propiedades de una promesa directamente, ya que declarar una variable de una propiedad es síncrono mientras que su método url() es asíncrono.
El tipo de datos de axios.get(url) es Promise cuando no se devuelve la respuesta, por lo que no tiene una propiedad data a la que accede desde el principio. Por lo tanto, debe esperar la respuesta. Como cuando se devuelve la respuesta, el tipo de datos de ese método cambia a lo que debería ser. Ahí es cuando puede acceder a la propiedad data . Entonces, creo que su código debería ser como el siguiente:
const url = 'https://no-api-key.com/api/v2/animals/cat'; let image; let fact; try { const axiosUrl = await axios.get(url); const data = axiosUrl.data; console.log(data); image = data.image; fact = data.fact; } catch (e) { console.log(e) return message.channel.send('An error occured, please try again!'); } Suponiendo que este bloque de código esté en un contexto asíncrono, debería funcionar bien.
Espero que esta respuesta te haya sido de utilidad.