首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试在异步云函数(节点v8)中执行fs.writefile()

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

Stack Overflow用户
提问于 2019-03-14 11:06:57
回答 2查看 2.2K关注 0票数 3

我目前正在构建一个云功能,以便从电子商务网站中获取一些数据。我在Node.js v8环境中运行它们,所以我可以使用async/await而不进行转涂。

我需要一种方法来保存一个文件与html响应从网站,以便我可以检查它,并决定如何最好地刮它。但我一直没能让它发挥作用。

正如我在许多地方发现的那样,我需要一种方法来推进fs.writeFile()函数,以便我能够为它提供await。我尝试过使用util.promisify,并在下面构建了自定义函数(这两种方法都产生了相同的结果,即当我为结果创建await时,云函数会崩溃):

index.js (云功能的主文件-简化版)

代码语言:javascript
复制
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
  };

Note1: --这是代码的简化版本,但是破坏函数的一行代码是:await promisifiedWriteFile('12345');,当我注释掉它时,其他一切都正常工作。

Note2:创建文件response.html (包含空内容),即使函数在此时崩溃。

Note3:,我应该试着写response.body'12345'只用于测试。但不管怎样它都会崩溃。

我做错了什么?

编辑

代码语言:javascript
复制
// THIS IS WHAT LOGS OUT OF MY FUNCTION
info: User function triggered, starting execution
info: Execution took 2034 ms, finished with status: 'crash'

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

Note4: --我还没有部署这个函数。这都取决于当地的发展。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-14 13:31:35

我已经设法做到了。

根据这个Firebase youtube视频os.tmpdir() 只有一个可由函数的代码写的目录.

下面的情况也是如此,现在它起作用了:

index.js

代码语言:javascript
复制
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

票数 7
EN

Stack Overflow用户

发布于 2019-03-14 11:20:29

我相信您不允许在Firebase函数上写入文件系统。试着写信给/tmp,见云函数用于Firebase支持文件操作吗?

但是我认为您不应该是writing response.html,而是应该在Firebase函数返回的响应中设置文本和状态代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55160931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档