Async Await ведет себя не так, как ожидалось - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь сделать функцию на моем сервере узлов, которая использует cheerio для очистки веб-страниц, проблема в том, что мои функции не работают должным образом,

Контроллер:

class ScrapperController {
    static async scrapDwelling(req, res, next) {
        try {
            const dwelling = await ScrapperService.getDwelling(req.params.url);
            console.log(dwelling);
            res.send({dwelling});
        } catch (err) {
            next(err);
        }
    }
}

тогда мой сервис:

static async getDwelling(url) {
    const dwelling = {};
    await request(`https://www.zonaprop.com.ar/propiedades/${url}`, (err, resp, html) => {
        const $ = cheerio.load(html);
        dwelling.type = $('.price-operation', '#article-container').text();
        dwelling.price = $('.price-items', '#article-container').text();
        dwelling.description = $('.section-description', '#article-container').text();
        dwelling.title = $('.title-type-sup > b').text();
        dwelling.location = $('.title-location > b').text();
        const coordinatesHelper = ($('.static-map', '#article-map').attr('src'));
        const coordinates = coordinatesHelper.substring(
            coordinatesHelper.lastIndexOf('markers=') + 8,
            coordinatesHelper.lastIndexOf('&channel')
        );
        dwelling.coordinates = coordinates;
        console.log($('#tab-foto-flickity').find('img').length);
        return dwelling;
    });
    return dwelling;
}

когда вы видите консольные журналы, по какой-то причине функция сначала возвращается, а затем выполняет код. я получаю это в консоли:

} {

GET /public-api/scrapper/42998731.html 200 6,559 мс - 15

36

1 Ответ

0 голосов
/ 05 ноября 2018

Модуль узла request не возвращает обещание, он использует функцию обратного вызова. Вы можете вручную обернуть ваш запрос в Обещание следующим образом:

static getDwelling(url) {
    return new Promise((resolve, reject) => {
        request(`https://www.zonaprop.com.ar/propiedades/${url}`, (err, resp, html) => {
            if(err) {
                return reject(err);
            }
            resolve(html);
        });
    }).then((html) => {
        const $ = cheerio.load(html);
        const dwelling = {};
        dwelling.type = $('.price-operation', '#article-container').text();
        dwelling.price = $('.price-items', '#article-container').text();
        dwelling.description = $('.section-description', '#article-container').text();
        dwelling.title = $('.title-type-sup > b').text();
        dwelling.location = $('.title-location > b').text();
        const coordinatesHelper = ($('.static-map', '#article-map').attr('src'));
        const coordinates = coordinatesHelper.substring(
            coordinatesHelper.lastIndexOf('markers=') + 8,
            coordinatesHelper.lastIndexOf('&channel')
        );
        dwelling.coordinates = coordinates;
        console.log($('#tab-foto-flickity').find('img').length);
        return dwelling;
    });
}

Или вы можете использовать библиотеку типа request-обещание-native .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...