значение корректно перед оператором return, но не определено в других частях кода

#javascript #function #axios #return #node-modules

#javascript #функция #axios #Возврат #узлы-модули

Вопрос:

Я программирую Discord-бота со многими функциями, которые вызывают API, поэтому я добавил functions.js в свой проект файл с различными функциями, которые я, кажется, часто использую, например, получение данных из вызова API.

В моем functions.js файле у меня есть такой код:

 const axios = require('axios');

function randomEl(arr) {
    const index = Math.floor(Math.random() * arr.length);
    return arr[index];
}

function axiosGet(url) {
    axios.get(url).then((response) => {
        const { data } = response;
        return data;
    }).catch((err) => {
        throw err;
    });
}

module.exports = {
    randomEl,
    axiosGet
}

 

Я поставил a console.log перед оператором return, и он показал данные axios, но когда я регистрирую значение, которое функция возвращает в моем index.js файле, оно есть undefined .

Мой index.js файл выглядит следующим образом:

 const fns = require('./functions.js');

try {
    const url = `https://api.tenor.com/v1/search?q=${searchTerm}amp;key=${process.env.TENNOR_KEY}`;
    const data = fns.axiosGet(url);
    console.log(data);
} catch (err) {
    console.log(err);
    msg.reply('An Error Has Occured');
}
 

Данные в этой части кода есть undefined , но в фактической axiosGet функции перед возвратом он показывает правильные данные, когда я их регистрирую.

Ответ №1:

Похоже, в вашем коде есть две проблемы. Во-первых, похоже, что вы забыли вернуть результат axios.get . Попробуйте изменить свою axiosGet функцию на следующую:

 function axiosGet(url) {
    return axios.get(url).then((response) => {
        const { data } = response;
        return data;
    }).catch((err) => {
        throw err;
    });
}
 

Далее, поскольку axiosGet возвращает a Promise , вам нужно будет дождаться выполнения обещания, прежде чем вы сможете использовать результат. Если ваш второй блок кода находится внутри асинхронной функции, вы можете сделать следующее:

 try {
    const url = `https://api.tenor.com/v1/search?q=${searchTerm}amp;key=${process.env.TENNOR_KEY}`;
    const data = await fns.axiosGet(url);
    console.log(data);
} catch (err) {
    console.log(err);
    msg.reply('An Error Has Occured');
}
 

В противном случае вы можете обновить его, чтобы использовать Promise.then метод:

 const url = `https://api.tenor.com/v1/search?q=${searchTerm}amp;key=${process.env.TENNOR_KEY}`;
fns.axiosGet(url).then(data => {
    console.log(data);
}).error(err => {
    console.log(err);
    msg.reply('An Error Has Occured');
});