错误:函数崩溃超出请求范围函数调用被中断

时间:2019-01-09 22:59:24

标签: javascript node.js google-cloud-functions

我正在编写一个Cloud Function,它从.csv文件读取几行并为每行发送一个HTTP请求,但是我遇到了上面的错误。

此错误已被问过(hereherehere列出了一些错误),但是在所有这些情况下,问题是该函数未返回一个只能在每次异步操作后才能解决的承诺。

据我对async的工作原理的理解,我的代码似乎没有这个问题。这是要点,删除了一些特定的细节:

    const request = require('request-promise-native');
    const storage = require('@google-cloud/storage')();

    exports.sendData = async (data, context) => {
      const [file] = await storage.bucket(data.bucket).file(data.name).download();
      const [header, ...table]  = file.toString('utf8').split('\n').map(row => row.split(','));
      const rows = table.map(
        row => header.reduce((obj, col, i) => {
          obj[col] = row[i];
          return obj;
        }, {})
      );

      const paramList = rows.map(({csv_field1, csv_field2}) => ({
        req_field1: csv_field1,
        req_field2: csv_field2,
        // etc.
      }));

      let errors = 0;
      console.log(`Sending ${paramList.length} rows...`);
      await Promise.all(paramList.map(async (param, i) => {
        try {
          await request.get({url: "", qs : param}); // Endpoint removed
          if ((i + 1) % 10000 == 0) {
            console.log(`${i+1} rows ${paramList.length} sent.`);
          }
        } catch (e) {
          console.log(`Request failed for row ${i+1} .\n\n${e}`);
          errors++;
        }
      }));
      console.log(`Done.`);
      if (errors > 0) {
        console.log(`Total errors: ${errors}`);
      }
    };

上面的代码在几行(10)上工作得很好,但是在尝试更大的数字(1000)时错误开始出现。 “完成”。该消息也未出现在日志中,因此该功能似乎没有达到终点。

有任何线索吗?

1 个答案:

答案 0 :(得分:0)

我在项目中遇到了同样的错误。 我通过将运行时从node8降级到node6来解决了