Планирование сценария Node.js на GCP с использованием облачных функций - PullRequest
0 голосов
/ 03 марта 2019

Я создал скрипт, который удаляет информацию с веб-страницы и записывает ее в Google Sheet.Это прекрасно работает на моей локальной машине, но я бы хотел запланировать это на GCP.

Звучит так, будто облачные функции - это путь, но когда я развертываю свою функцию, я получаю эту ошибку:

Не удалось выполнить функцию при загрузке кода пользователя.Сообщение об ошибке: ожидается, что модуль Node.js, определенный в файле working.js, будет экспортировать функцию с именем run

. Я не уверен, что мне следует использовать в качестве «Функции для выполнения».Вот функция, которую я загрузил:

const puppeteer = require('puppeteer');
const jsonexport = require('jsonexport');
const GoogleSpreadsheet = require('google-spreadsheet');
const creds = require('./google-generated-creds.json');
const fs = require('fs');

var doc = new GoogleSpreadsheet('1qaFi0xnhaCZEduylUvGXWpyMJv00Rz6Y9qqyFR1E9oI');

function run() {
    return new Promise(async (resolve, reject) => {
        try {
            const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
            const page = await browser.newPage();
            const urls = [
            "https://www.marksandspencer.com/pure-cotton-long-sleeve-jumpsuit/p/p60258655?image=SD_01_T42_6701_XB_X_EC_90&color=INDIGO&prevPage=plp",
            "https://www.marksandspencer.com/cotton-rich-striped-3-4-sleeve-t-shirt/p/p60210598?prevPage=plp",
            "https://www.marksandspencer.com/high-neck-long-sleeve-blouse/p/p60260040?image=SD_01_T43_5168_HD_X_EC_90&color=LIGHTDENIM&prevPage=plp",
            "https://www.marksandspencer.com/pure-cotton-printed-short-sleeve-t-shirt/p/p60263529?image=SD_01_T41_8030Z_Z4_X_EC_90&color=WHITEMIX&prevPage=plp",
            "https://www.marksandspencer.com/pure-cotton-button-detailed-denim-mini-skirt/p/p60260145?image=SD_01_T57_4004_QP_X_EC_90&color=DARKINDIGO&prevPage=plp",
            "https://www.marksandspencer.com/pure-cotton-long-sleeve-shirt-midi-dress/p/p60258654?image=SD_01_T42_6703_HP_X_EC_90&color=DENIM&prevPage=plp",
            "https://www.marksandspencer.com/mid-rise-skinny-leg-ankle-grazer-jeans/p/p60220155?prevPage=plp",
            "https://www.marksandspencer.com/pure-cotton-long-sleeve-shirt/p/p60260208?image=SD_01_T43_5181_HP_X_EC_90&color=DENIM&prevPage=plp",
            "https://www.marksandspencer.com/long-sleeve-shirt-mini-dress/p/p60258652?image=SD_01_T42_6704_HP_X_EC_90&color=DENIM&prevPage=plp",
            "https://www.marksandspencer.com/wide-fit-suede-lace-up-trainers/p/p60216277?prevPage=plp",
            "https://www.marksandspencer.com/suede-ankle-boots/p/p60226911?prevPage=plp",
            "https://www.marksandspencer.com/leather-buckle-hip-belt/p/p60186701?prevPage=plp",
            "https://www.marksandspencer.com/cross-body-bag/p/p60215352?prevPage=plp"
            ];
            const productsList = [];
            for (let i = 0; i < urls.length; i++) {
                const url = urls[i];
                await page.goto(url);
                let products = await page.evaluate(() => {
                    let product = document.querySelector('h1[itemprop=name]').innerText;
                    let results = [];
                    let items = document.querySelectorAll('[data-ttip-id=sizeGridTooltip] tbody tr td label');
                    items.forEach((element) => {
                        let size = element.getAttribute('for');
                        let stockLevel = "";
                        let nearest_td = element.closest('td');
                        if (nearest_td.classList.contains('low-stock')) {
                            stockLevel = "Low stock"
                        } else if (nearest_td.classList.contains('out-of-stock')) {
                            stockLevel = "Out of stock"
                        } else {
                            stockLevel = "In stock"
                        }
                        results.push({
                            product: product,
                            size: size,
                            stock: stockLevel
                        })
                    });
                    return results
                })
                productsList.push(products)
            }
            browser.close();

            function flatten(arr) {
                return arr.reduce(function(flat, toFlatten) {
                    return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
                }, []);
            }
            var flatProducts = flatten(productsList)
            flatProducts.forEach(function(row) {
                // Authenticate with the Google Spreadsheets API.
                doc.useServiceAccountAuth(creds, function(err) {
                    // Get all of the rows from the spreadsheet.
                    doc.addRow(1, row, function(err, rows) {
                        console.log(row);
                    });
                });
            });

        } catch (e) {
            return reject(e);
        }
    })
}
run().then(console.log).catch(console.error);

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

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Что относится к этим ошибкам, так это к тому, что Cloud Functions не может найти функцию для запуска в этом файле (working.js), потому что вы не экспортировали одну.Например, если вы создаете облачную функцию с именем run, вы должны экспортировать функцию в сценарии, назначив ее exports.run в вашем модуле:

exports.run = (event, callback) => {
  callback(null, `Hello ${event.data.name || 'World'}!`);
};

В * 1009 есть еще примеры* документация , но, вероятно, для работы с GCP в вашем сценарии потребуются другие изменения для аутентификации и т. д.

0 голосов
/ 04 марта 2019

Вы не можете просто загрузить любой скрипт для запуска.Вы должны определить функцию, используя либо Облачные инструменты (через gcloud) , либо Инструменты Firebase и SDK .Вам также придется выяснить, как вы хотите вызвать его.Когда функция запускается, вы можете организовать выполнение своего кода.

Я бы сказал, что в основном нетривиально просто перенести существующий скрипт в Cloud Functions.Вам потребуется время, чтобы узнать, как работает система, чтобы эффективно ее использовать.

...