Кукловод и экспресс не могут загрузить новые данные с помощью REST API - PullRequest
1 голос
/ 07 июня 2019

Я использую кукловод для очистки страницы, содержимое которой периодически меняется, и использую экспресс для представления данных в остальные API.Если я включу Chrome без головы, чтобы увидеть, что отображается в браузере, новый data есть, но данные не отображаются в get() и http://localhost:3005/api-weather.Обычный браузер показывает только исходные данные.

const express = require('express');
const server = new express();
const cors = require('cors');
const morgan = require('morgan');
const puppeteer = require('puppeteer');

server.use(morgan('combined'));
server.use(
    cors({
        allowHeaders: ['sessionId', 'Content-Type'],
        exposedHeaders: ['sessionId'],
        origin: '*',
        methods: 'GET, HEAD, PUT, PATCH, POST, DELETE',
        preflightContinue: false
    })
);

const WEATHER_URL = 'https://forecast.weather.gov/MapClick.php?lat=40.793588904953985&lon=-73.95738513173298';
const hazard_url2 = `file://C:/Users/xdevtran/Documents/vshome/wc_api/weather-forecast-nohazard.html`;

(async () => {
    try {
        const browser = await puppeteer.launch({ headless: true });
        const page = await browser.newPage();

        await page.setRequestInterception(true);
        page.on("request", request => {
            console.log(request.url());
            request.continue();
        });


        await page.goto(hazard_url2, { timeout: 0, waitUntil: 'networkidle0' });
        hazard = {
            "HazardTitle": "stub",
            "Hazardhref": "stub"
        }

        let forecast = await page.evaluate(() => {

            try {
                let forecasts = document.querySelectorAll("#detailed-forecast-body.panel-body")[0].children;

                let weather = [];
                for (var i = 0, element; element = forecasts[i]; i++) {

                    period = element.querySelector("div.forecast-label").textContent;
                    forecast = element.querySelector("div.forecast-text").textContent;

                    weather.push(
                        {
                            period,
                            forecast
                        }
                    )
                }

                return weather;
            } catch (err) {
                console.log('error in evaluate: ', err);
                res.end();
            }
        }).catch(err => {
            console.log('err.message :', err.message);
        });


        weather = forecast;

        server.get('/api-weather', (req, res) => {
            try {

                res.end(JSON.stringify(weather, null, '  '));
                console.log(weather);
            } catch (err) {
                console.log('failure: ', err);
                res.sendStatus(500);
                res.end();
                return;
            }
        });
    } catch (err) {
        console.log('caught error :', err);
    }
    browser.close();
})();


server.listen(3005, () => {
    console.log('http://localhost:3005/api-weather');
});

Я пробовал несколько решений WaitUntil , WaitFor , .then и sleep но, похоже, ничего не работает.

Интересно, имеет ли это какое-то отношение к express get ()?Я использую res.end() вместо res.send(), потому что json выглядит лучше, когда я использую res.end().Я действительно не знаю различий.

Я также готов использовать это решение reload .Но я получил ошибки и не использовал его.Я также пытался waitForNavigation () , но я тоже не знаю, как это работает.

Возможно, я использую неправильный поисковый термин, чтобы найти решение.Кто-нибудь может указать мне правильное направление?Спасибо.

...