Как получить доступ к массиву данных в моей функции ax ios - PullRequest
0 голосов
/ 13 апреля 2020

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

Когда я пытаюсь отобразить это в своем представлении, я получаю неопределенное, не могу свойство чтения длины;

const getData = () => {
    axios.get("https://www.worldometers.info/coronavirus/")
        .then(res => {
            const data = [];
            const $ = cheerio.load(res.data);
            $('.maincounter-number').each((index, element) => {
                const numberData = $(element).text();
                data[0] = {numberData: numberData};
            });
        }).catch(err => {
        console.log("Error fetching and parsing data: ", err);
    });

}


app.get("/", (req, res) => {
    const data = getData();;
    res.render('index', {title: 'Home', data: data});

});

Pug View

p #{data.dataNumbers}

Я тоже пробовал эту функцию, но у меня та же проблема

async function scrapeWorldOMeter(){
   try{
       const worldOMeterResponse = await axios.get("https://www.worldometers.info/coronavirus/");
       const data = [];
       const $ = cheerio.load(worldOMeterResponse.data);
       $('.maincounter-number').each((index, element) => {
       const numberData = $(element).text();
       data[0] = {numberData: numberData};
       return data[0];
   });

   }
   catch(err){
       throw new Error(`Can't scrape WorldOMeter ${err}`)
   }
}


app.get("/", async(req, res) => {
const data = await scrapeWorldOMeter()
res.render('index', {title: 'Home', data});
});

1 Ответ

0 голосов
/ 13 апреля 2020

Вы можете исправить свой первый фрагмент кода, правильно используя обещания,

const getData = () => {
    return axios
        .get('https://www.worldometers.info/coronavirus/')
        .then((res) => {
            const data = [];
            const $ = cheerio.load(res.data);
            $('.maincounter-number').each((index, element) => {
                const numberData = $(element).text();
                data[0] = { numberData: numberData };
            });
            return data[0];
        })
        .catch((err) => {
            console.log('Error fetching and parsing data: ', err);
        });
};

app.get('/', (req, res) => {
     const data = getData().then((res) => {
        res.render('index', { title: 'Home', data: data });
    });   
});

Проблема заключалась в том, что вы не возвращали обещание топора ios в getData (), а также не связывали цепочку ответ с then в маршруте получения.

Ваш второй фрагмент кода можно исправить, правильно используя async / await,

async function scrapeWorldOMeter() {
    try {
        const worldOMeterResponse = await axios.get(
            'https://www.worldometers.info/coronavirus/'
        );
        const data = [];
        const $ = cheerio.load(worldOMeterResponse.data);
        $('.maincounter-number').each((index, element) => {
            const numberData = $(element).text();
            data[0] = { numberData: numberData };
        });
        return data[0];
    } catch (err) {
        throw new Error(`Can't scrape WorldOMeter ${err}`);
    }
}

app.get("/", async(req, res) => {
const data = await scrapeWorldOMeter();
res.render('index', {title: 'Home', data});
});

Проблема заключалась в том, что вы возвращали данные [0 ] внутри jquery каждый л oop. Вы просто должны переместить его на следующую строку за пределами l oop

...