Невозможно развернуть функцию firebase, используя Typescript и Puppeteer - PullRequest
1 голос
/ 26 апреля 2020

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

 Function failed on loading user code. Error message: Code in file lib/index.js can't be 
    loaded. Is there a syntax error in your code? Detailed stack trace: TypeError 
    [ERR_INVALID_ARG_TYPE]: The "original" argument must be of type function
    at promisify (internal/util.js:214:11)
    at Object.<anonymous> (/srv/node_modules/extract-zip/index.js:11:18)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/srv/node_modules/puppeteer/lib/BrowserFetcher.js:21:17)

Файл index.ts, куда я экспортирую свою функцию, выглядит следующим образом:

import * as admin from "firebase-admin";
import * as functions from "firebase-functions";
import urls from "./data/urls";
import scraper from "./scraper";

admin.initializeApp();

exports.data = functions
  .runWith({ timeoutSeconds: 30, memory: "1GB" })
  .region("europe-west1")
  .https.onRequest(async (req, res) => {
    try {
      const products = await Promise.all(urls.map((url) => scraper(url)));
      res.send(products);
    } catch (e) {
      console.log(e);
    }
  });
`

Файл скребка

export default async function scraper(url: string) {
  const browser = await puppeteer.launch({
    headless: true,
    args: ["--no-sandbox"],
  });
  const page = await browser.newPage();
  await page.goto(url);
  await page.waitFor(3000);

  const title = await page.$eval(
    "#productTitle",
    (el) => (el as HTMLElement).innerText
  );
  const image = await page.$eval("#landingImage", (img) =>
    img.getAttribute("src")
  );
  let price;

  if ((await page.$("#price_inside_buybox")) !== null) {
    price = await page.$eval(
      "#price_inside_buybox",
      (el) => (el as HTMLElement).innerText
    );
  } else {
    price = "precio segunda";
  }

  const res = {
    title,
    image,
    price,
  };

  await browser.close();
  return res; // TODO somehow get the promotions
}

Ответы [ 3 ]

2 голосов
/ 29 апреля 2020

У меня была точно такая же проблема, и я решил ее, вернувшись к puppeteer@2.1.1

Если вы не используете особенность 3.xx, указанную c, это обходной путь, пока проблема не будет устранена.

0 голосов
/ 10 мая 2020

У меня была та же проблема, но я понял, что это потому, что кукловод больше не использует узел 8 начиная с версии 3 и далее, как описано в их версии 3.0.0 https://github.com/puppeteer/puppeteer/releases/tag/v3.0.0

Кому Чтобы решить эту проблему, вам нужно изменить версию вашего узла в пакете. json файл в вашей папке функций. Вам нужно изменить это значение с

"engines": {
"node": "8"
 },

на

"engines": {
"node": "10"
}
0 голосов
/ 29 апреля 2020

Спасибо, Берри, это сработало для меня. Мы дождемся исправления проблемы с версией 3.

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