TypeError: 'x' не является функцией - PullRequest
0 голосов
/ 13 апреля 2020

Я работаю с Express веб-приложением, которое запускает JavaScript очистку кода при первой загрузке страницы.

Вот код очистки веб-узла (scrape. js):

const request = require('request-promise');
const cheerio = require('cheerio');
const fs = require('fs');
const data = require('../public/state_data.json');
const cases_data = require('../public/cases_data.json');

// retrieve wikipeida page
request('https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_the_United_States', (error, response, html) => {
if(!error && response.statusCode == 200) {
    // create cheerio scraper 
    const $ = cheerio.load(html);

    // find, and loop through all the rows in the table
    var rows = $('.wikitable').find('tr');
    for(var i = 3; i < 59; i++) {
        // scrape state name and cases from table
        var state = $(rows[i]).children('th:nth-child(2)').text().split("\n");
        var cases = parseInt($(rows[i]).children('td').html().replace(",", ""));

        // update state_data.json file w/ proper cases and per capita
        for(var j = 0; j < data.length; j++) {
            if(data[j].state === state[0]) {
                // push new data to cases_data.json
                cases_data.push({
                    state: state[0],
                    latitude: data[j].latitude,
                    longitude: data[j].longitude,
                    cases: cases,
                    percapita: (cases / data[j].population)
                });

                // write to new cases_data.json file w/ state name, cases and calculated per capita 
                fs.writeFile('../public/cases_data.json', JSON.stringify(cases_data, null, 2), function(err) {
                        if (err) throw err;
                });
            }
        }
    }
} else {
    console.log('request error')
}
});

А вот приложение express (app. js):

const express = require('express');
const app = express();
const port = 3000;
const scrape = require('./scrape.js');

app.get('/', (req, res) => {
    scrape();
    res.render('index');
})

app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))

Прямо сейчас, когда я запускаю 'приложение узла. js', я получаю это как ошибку:

TypeError: scrape не является функцией

Я пытался обернуть лом. js в функции, но безрезультатно. Любые идеи?

Ответы [ 2 ]

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

Вам нужно экспортировать функцию из scrape.js, например:

const request = require('request-promise');
const cheerio = require('cheerio');
const fs = require('fs');
const data = require('../public/state_data.json');
const cases_data = require('../public/cases_data.json');

module.export = () => {
    // retrieve wikipeida page
    request('https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_the_United_States', (error, response, html) => {
        ...
    });
};

Кроме того, я предлагаю вам обработать ваш асиновый c код с обратным вызовом или обещанием, например:

  • С обещанием:
// scrape.js
module.export = () => {
    return new Promise((resolve, reject) => {
        // retrieve wikipeida page
        request('https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_the_United_States', (error, response, html) => {
            if(!error && response.statusCode == 200) {
                ...
                resolve();
            } else {
                console.log('request error');
                reject(error);
            }
        });
    });
};

// app.js
app.get('/', (req, res) => {
    scrape()
        .then(() => {
            res.render('index');
        })
        .catch((error) => {
            // response with an error
        });
});
  • С обратным вызовом:
// scrape.js
module.export = (cb) => {
    // retrieve wikipeida page
    request('https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_the_United_States', (error, response, html) => {
        if(!error && response.statusCode == 200) {
            ...
            cb(null);
        } else {
            console.log('request error');
            cb(error);
        }
    });
};

// app.js
app.get('/', (req, res) => {
    scrape((error) => {
        if (error) {
            // response with an error;
            return;
        }

        res.render('index');
    });
})
0 голосов
/ 13 апреля 2020

Экспорт функции:

// scrape.js
module.exports = () => {
    request('https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_the_United_States', (error, response, html) => {
        // rest of function
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...