尝试在异步云函数(节点 v8)中执行 fs.writefile()

cbd*_*per 3 javascript node.js async-await firebase google-cloud-functions

我目前正在构建一个云功能来从电子商务网站上抓取一些数据。我在 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
  };

Run Code Online (Sandbox Code Playgroud)

注意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'
Run Code Online (Sandbox Code Playgroud)

下面是我的客户端得到的:错误消息很简单internal,因为云函数避免将内部错误详细信息传递给客户端。

在此处输入图片说明

Note4:我还没有部署这个功能。这一切都取决于当地的发展。

cbd*_*per 6

我设法做到了。

根据这个 Firebase youtube 视频这是您的函数代码可写os.tmpdir() 唯一一个目录。

因此做了以下工作,现在它可以工作了:

索引.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();
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

从我正在调用的函数内部:

await promisifiedWriteFile(response.body);

在此链接上也找到了一些相关文档:

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