Así que tengo esta función async en la que hago varias llamadas a la DNS Api de NodeJS. Las dos primeras llamadas devuelven datos, pero debido a la tercera, el bloque catch se activa y no obtengo los datos de las dos primeras.
Como todo depende del tipo de consulta ( netflix.com ), algunas de las operaciones de espera pueden arrojar un error debido a que no hay datos. Pero lo que quiero es obtener datos de las otras llamadas, incluso si hay errores en algunas de ellas.
Aquí está el código:
const dnsResolve = async () => { const query = 'netflix.com'; try{ const aRecord = await dns.resolve4(query); const aaaaRecord = await dns.resolve6(query); const cnameRecord = await dns.resolveCname(query); console.log(aRecord); console.log(aaaaRecord); console.log(cnameRecord); }catch(err) { console.log(err); } } dnsResolve();El código anterior devuelve
Error: queryCname ENODATA netflix.com at QueryReqWrap.onresolve [as oncomplete] (internal/dns/promises.js:167:17) { errno: undefined, code: 'ENODATA', syscall: 'queryCname', hostname: 'netflix.com' }Salidas individuales de las dos primeras consultas:
aRecord: [ { address: '51.73.1.12' }, { address: '55.83.62.128' }, { address: '12.12.82.118' } ] aaaaRecord: [ { address: '2406:da200:ff00::222c0:598a' }, { address: '24206:da00:ff00::22c2:44203' }, { address: '2406:da0e0:ff00::36de2:41fd' } ]Cómo quiero mostrar los datos:
[ { address: '51.73.1.12' }, { address: '55.83.62.128' }, { address: '12.12.82.118' }, { address: '2406:da200:ff00::222c0:598a' }, { address: '24206:da00:ff00::22c2:44203' }, { address: '2406:da0e0:ff00::36de2:41fd' }, { NO CNAME RECORDS } ] Tenga en cuenta que habrá alrededor de 6 llamadas a la DNS API . No se puede determinar cuál activará un error debido a que no hay datos. Depende totalmente de la consulta.
Este es el caso de uso de Promise.allSettled para:
const results = await Promise.allSettled([ dns.resolve4(query), dns.resolve6(query), dns.resolveCname(query), ]); for (const {status, value, reason} of results) { if (status === "fulfilled") { // Promise was fulfilled, use `value`... } else { // Promise was rejected, see `reason` for why... } }O si solo quieres los resultados exitosos:
const results = await Promise.allSettled([ dns.resolve4(query), dns.resolve6(query), dns.resolveCname(query), ]); const values = results.filter(({status}) => status === "fulfilled") .map(({value}) => value); // ...use `values`...