Búsqueda de sitios web

javascript - Devolviendo datos de la API de Axios


Estoy intentando usar una aplicación Node.JS para hacer y recibir solicitudes de API. Hace una solicitud GET a otro servidor usando Axios con los datos que recibe de una llamada API que recibe. El segundo fragmento es cuando el script devuelve los datos de la llamada. De hecho, los tomará y los escribirá en la consola, pero no los enviará de vuelta en la segunda API.

function axiosTest() {
    axios.get(url)
        .then(function (response) {
            console.log(response.data);
            // I need this data here ^^
            return response.data;
        })
        .catch(function (error) {
            console.log(error);
        });
}

...

axiosTestResult = axiosTest(); 
response.json({message: "Request received!", data: axiosTestResult});

Soy consciente de que esto está mal, solo estoy tratando de encontrar una manera de hacerlo funcionar. La única forma en que parece que puedo obtener datos de ello es a través de console.log, lo cual no es útil en mi situación.

Respuesta #1

El problema es que la función original axiosTest() no está devolviendo la promesa. Aquí hay una explicación ampliada para mayor claridad:

function axiosTest() {
    // create a promise for the axios request
    const promise = axios.get(url)

    // using .then, create a new promise which extracts the data
    const dataPromise = promise.then((response) => response.data)

    // return it
    return dataPromise
}

// now we can use that data from the outside!
axiosTest()
    .then(data => {
        response.json({ message: 'Request received!', data })
    })
    .catch(err => console.log(err))

La función puede escribirse de manera más concisa:

function axiosTest() {
    return axios.get(url).then(response => response.data)
}

O con async/await:

async function axiosTest() {
    const response = await axios.get(url)
    return response.data
}
  • Guía sobre el uso de promesas
  • Información sobre funciones asíncronas

Respuesta #2

Sé que esta publicación es antigua. Pero he visto varios intentos de chicos tratando de responder usando async y await pero equivocándose. Esto debería aclararlo para cualquier referencia nueva.

ACTUALIZACIÓN: mayo de 2023 Esta respuesta sigue despertando mucho interés y la he actualizado/corregido para usar funciones flecha

const axiosTest = async () => {
  try {
    // use data destructuring to get data from the promise object
    const { data: response } = await axios.get(url); 
    return response;
  } catch (error) {
    console.log(error);
  }
};

Respuesta #3

puedes llenar los datos que quieras con una función de devolución de llamada simple, digamos que tenemos una lista llamada lst que queremos llenar, tenemos una función que llena la lista,

const lst = [];  
const populateData = (data) => {lst.push(data)} 

ahora podemos pasar la función de callback a la función que está haciendo la llamada de axios y podemos llenar la lista cuando recibimos datos de la respuesta.

ahora hacemos nuestra función que realiza la solicitud y pasamos populateData como una función de devolución de llamada.

function axiosTest (populateData) {
        axios.get(url)
       .then(function(response){
               populateData(response.data);
        })
        .catch(function(error){
               console.log(error);
         });
}   

Artículos relacionados