Nodejs / nestjs: время отклика 13 с от моих нескольких сканеров - PullRequest
0 голосов
/ 30 сентября 2019

Я создаю газетное приложение, похожее на мобильное приложение Flipboard! используя nodejs nestjs framework.

Так что я ползаю по нескольким веб-сайтам, чтобы получить данные, и у меня получился массив, содержащий более 60 элементов только для первой страницы, собранной с каждого веб-сайта, и время отклика в диапазоне 10 с. 15-ым ведьмам недопустимо только для 3 сайтов !!!!

Я искал это и обнаружил, что nestjs предоставляет сервис кеширования, и это было здорово, кешируя результаты, заканчивающиеся на 20 мс, но!

Я не использую БД любого типа, так как я не собираю данные! только заголовки и URL-адреса для iframes

Мои проблемы:

  1. Как разбить эти 60 элементов на страницу и в конце сделать новый запрос дляСледующая страница от моих сканеров.
  2. Первый пользователь столкнется с тем временем ответа 15 с каждые 6 часов (мой конец кэша), как заставить сервер автоматически кэшировать данные, не ожидая запроса

Код сканера:(У меня 3 функции, подобные этой, почти одинаковые, меняются только селекторы CSS)

async getArticlesFromTechWD(page: number) {
    const html = await get('https://www.tech-wd.com/wd/category/news/page/' + page);

    // Cheerio
    let $ = load(html);

    function formatingDate(date) {
        let months = ["يناير", "فبراير", "مارس", "إبريل", "مايو", "يونيو",
            "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"
        ];

        date = date.replace('،', '').split(' ');
        const year = date[2];
        const month = (months.indexOf(date[1]) + 1).toString().length == 1 ? '0' + (months.indexOf(date[1]) + 1) : (months.indexOf(date[1]) + 1)
        const day = date[0];

        return `${year}-${month}-${day}`;
    }

    const articles = $('#masonry-grid .post-element').map(function () {
        return {
            title: $('.thumb-title', this).text().trim(),
            date: formatingDate($('.date', this).text().trim()),
            url: $('.thumb-title a', this).attr('href'),
            image: $('.slide', this).css('background-image').replace('url(', '').replace(')', '').replace(/\"/gi, ""),
            src: 'www.tech-wd.com'
        }
    }).get();

    return articles;
}

Объединение всех данных сканеров в один массив:

async getAllArticles(page: number, size: number) {

    const skip = size * (page - 1);

    // First crawler ( has an optional page pram default is page 1 )
    const unlimitTech = await this.getArticlesFromUnlimitTech();

    // Second crawler ( has an optional page pram default is page 1 )
    const tectWd = await this.getArticlesFromTechWD();

    // Merge them and sorted by date ( DESC )
    const all = unlimitTech.concat(tectWd).sort(() => Math.random() - 0.5);

    return all;

}

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Вместо одного за раз:

const unlimitTech = await this.getArticlesFromUnlimitTech();
const tectWd = await this.getArticlesFromTechWD();

Вы можете сделать оба одновременно:

const [unlimitTech, tectWd] = await Promise.all([
  this.getArticlesFromUnlimitTech(),
  this.getArticlesFromTechWD()
])
0 голосов
/ 30 сентября 2019

Хитрость заключается в том, чтобы делать несколько вещей одновременно. Начните все свои запросы, а затем await на каждом из них в конце. По крайней мере, ваше время звучит так, будто вы ожидаете завершения каждого запроса, прежде чем начинать следующий.

...