Estoy ejecutando mi código javascript con node.js y estoy usando la biblioteca de solicitud y promesa para generar solicitudes https que devuelven un json blob. Hasta ahora, he logrado enviar la solicitud correctamente, y recibo el objeto json deseado en la respuesta, pero solo veo las claves, no los valores. Quiero extraer el valor de una clave llamada "call_count". El problema al que me enfrento es la estructura peculiar de la sintaxis de solicitud-promesa , que parece impedirme hacer lo que quiero hacer.
Así es como se ve la respuesta JSON cuando ejecuto mi consulta en Postman:
{ "metric_data": { "from": "2021-12-12T23:56:12+00:00", "to": "2021-12-13T00:26:12+00:00", "metrics_not_found": [], "metrics_found": [ "Mobile/Crash/All" ], "metrics": [ { "name": "Mobile/Crash/All", "timeslices": [ { "from": "2021-12-12T23:53:00+00:00", "to": "2021-12-13T00:23:00+00:00", "values": { "call_count": 0 } } ] } ] } }Y aquí está mi código que genera la solicitud:
const rp = require ('request-promise'); let options = { method: 'GET', uri: 'https://api.crashCatcher.com/v2/mobile_applications/myAppID/metrics/data.json?names=Mobile/Crash/All&values[]=call_count&summarize=true', headers: { 'User-Agent': 'request-promise', 'X-Api-Key': 'MY API key goes here' }, json: true // Automatically parses the JSON string in the response }; rp(options).then(body => console.log(body)).catch(err => console.log(err.name, err.statusCode));Actualmente, cuando ejecuto este código, esto es lo que obtengo:
{ metric_data: { from: '2021-12-13T00:22:04+00:00', to: '2021-12-13T00:52:04+00:00', metrics_not_found: [], metrics_found: [ 'Mobile/Crash/All' ], metrics: [ [Object] ] } }Ahora, sé que estoy recuperando un objeto JSON, y sé que necesito hacer algo como:
var myJson = JSON.parse(*body*);Y luego algo como:
console.log(myJson.metric_data.metrics[0].timeslices[0].values.call_count);Pero cuando uso la sintaxis de solicitud-promesa , no sé cómo asignar correctamente lo que regresa en mi cuerpo de respuesta a una variable que luego puedo JSON. analizar y extraer el valor de call_count necesario.
No está limitado a usar funciones de flecha, e incluso las funciones de flecha pueden tener cuerpos de función completos.
Por ejemplo:
rp(options).then( body => { let myJson = JSON.parse(body); console.log(myJson.metric_data.metrics[0].timeslices[0].values.call_count); } ).catch(err => console.log(err.name, err.statusCode));o:
rp(options).then( function (body) { let myJson = JSON.parse(body) console.log(myJson.metric_data.metrics[0].timeslices[0].values.call_count) } ).catch(err => console.log(err.name, err.statusCode));o incluso:
function handleResponse (body) { let myJson = JSON.parse(body) console.log(myJson.metric_data.metrics[0].timeslices[0].values.call_count) } rp(options).then(handleResponse).catch(err => console.log(err.name, err.statusCode));o incluso:
const handleResponse = body => { let myJson = JSON.parse(body); console.log(myJson.metric_data.metrics[0].timeslices[0].values.call_count); } rp(options).then(handleResponse).catch(err => console.log(err.name, err.statusCode));Entonces, la solución fue eliminar json: true en mis opciones. Una vez hecho esto, ¡todas las soluciones enumeradas amablemente por Iñigo funcionaron! ¡Gracias de nuevo por la ayuda! Esta fue una gran experiencia de aprendizaje.
let options = { method: 'GET', uri: 'https://api.crashCatcher.com/v2/mobile_applications/960867101/metrics/data.json?names=Mobile/Crash/All&values[]=call_count&summarize=true', headers: { 'User-Agent': 'request-promise', 'X-Api-Key': 'My API key' } };