Попытка сделать fs.writefile () внутри асинхронной облачной функции (узел v8) - PullRequest
1 голос
/ 14 марта 2019

В настоящее время я создаю облачную функцию для очистки некоторых данных с сайтов электронной коммерции.Я запускаю их в среде Node.js v8, поэтому я могу использовать async/await без транспаранта.

Мне нужен способ сохранить файл с ответом html с веб-сайта, чтобы я могосмотрите его и решите, как лучше его почистить.И я не смог заставить его работать.

Поскольку я обнаружил повторный поиск во многих местах, мне нужен способ обещать функцию fs.writeFile(), чтобы я мог await для нее.Я пробовал с util.promisify, а также строил пользовательскую функцию ниже (обе приводят к одному и тому же результату, который вызывает сбой моей облачной функции, когда я await для результата):

index.js (основной файл для облачных функций - упрощенная версия)

const functions = require('firebase-functions');
const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');

// PROMISIFY WRITEFILE TO SAVE URL RESPONSE
const promisifiedWriteFile = function(text) {
  return new Promise((resolve, reject) => {
    fs.writeFile('./response.html', text, err => {
      if (err) {
        return reject(err);
      }
      return resolve();
    });
  });
};

exports.getUrlProductDetails = functions.https.onCall(
  async (data) => {

    try {
      // SEND REQUEST TO URL PRODUCT PAGE, PARSE WITH CHEERIO
      response = await promisifiedRequest(productURL);
      $ = cheerio.load(response.body);

      // TRYING TO SAVE FILE
      await promisifiedWriteFile('12345'); // <----- THIS IS CRASHING
    } // TRY BLOCK - OUTER - END

    catch (err) {
      console.log(err);
      throw new functions.https.HttpsError('unknown', 'Some internal error', err);
    }

  console.log('End of async function...');

  return {
    productDetails: productDetails,
    body: response.body // My client code is getting the body response just fine
  };

Примечание 1: Это упрощенная версия кода, но единственная строка, в которой происходит сбой функции,: await promisifiedWriteFile('12345'); и когда я это комментирую, все остальное работает просто отлично.

Примечание2: Файл response.html создается (с пустым содержимым) даже при сбое функции наэтот момент.

Примечание 3: Я должен пытаться написать response.body.'12345' только для тестирования.Но в любом случае происходит сбой.

Что я делаю не так?

РЕДАКТИРОВАТЬ

// THIS IS WHAT LOGS OUT OF MY FUNCTION
info: User function triggered, starting execution
info: Execution took 2034 ms, finished with status: 'crash'

И вот что получает мой клиент:сообщение об ошибке просто internal, потому что облачные функции избегают передачи подробностей внутренней ошибки клиенту.

enter image description here

Примечание 4: Iеще не развернул функцию.Это все на местном развитии.

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Я полагаю, что вы не можете записывать в файловую систему функции Firebase. Попробуйте написать в /tmp, см. Облачные функции для Firebase поддерживают файловую операцию? .

Но я думаю, что вы не должны быть writing response.html, вместо этого вы должны установить текст и код состояния в ответе, который возвращает функция Firebase.

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

Мне удалось это сделать.

В соответствии с этим видео с YouTube на Firebase , os.tmpdir() только один каталог, который доступен для записи кодом вашей функции.

Так же было сделано следующее, и теперь это работает:

index.js

const fs = require('fs');
const os = require('os');
const path = require('path');
const tmpdir = os.tmpdir();
const filePath = path.join(tmpdir,'response.html');

// PROMISIFY WRITEFILE TO SAVE URL RESPONSE
const promisifiedWriteFile = function(text) {
  return new Promise((resolve, reject) => {
    fs.writeFile(filePath, text, err => {
      if (err) {
        return reject(err);
      }
      return resolve();
    });
  });
};

И внутри вызываемой мной функции:

await promisifiedWriteFile(response.body);

Нашли также несколько связанных документов по этой ссылке:

https://cloud.google.com/functions/docs/concepts/exec

...