firebase - Cloud Functions for Firebase 中的套接字挂断错误

标签 firebase google-app-engine google-cloud-functions

我有一个由 Pub/Sub 事件触发的云函数。它使用 request-promise从我用于数据的 API 发出多个 GET 请求。

它在 Cloud Functions Emulator 本地运行时有效,但在生产中我不断收到此错误:

{ RequestError: Error: socket hang up
    at new RequestError (/user_code/node_modules/request-promise/node_modules/request-promise-core/lib/errors.js:14:15)
    at Request.plumbing.callback (/user_code/node_modules/request-promise/node_modules/request-promise-core/lib/plumbing.js:87:29)
    at Request.RP$callback [as _callback] (/user_code/node_modules/request-promise/node_modules/request-promise-core/lib/plumbing.js:46:31)
    at self.callback (/user_code/node_modules/request/request.js:185:22)
    at emitOne (events.js:96:13)
    at Request.emit (events.js:188:7)
    at Request.onRequestError (/user_code/node_modules/request/request.js:877:8)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:188:7)
    at TLSSocket.socketOnEnd (_http_client.js:346:9)
    at emitNone (events.js:91:20)
    at TLSSocket.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)
  name: 'RequestError',
  message: 'Error: socket hang up',
  cause: 
   { Error: socket hang up
       at createHangUpError (_http_client.js:254:15)
       at TLSSocket.socketOnEnd (_http_client.js:346:23)
       at emitNone (events.js:91:20)
       at TLSSocket.emit (events.js:185:7)
       at endReadableNT (_stream_readable.js:974:12)
       at _combinedTickCallback (internal/process/next_tick.js:80:11)
       at process._tickDomainCallback (internal/process/next_tick.js:128:9) code: 'ECONNRESET' },
  error: 
   { Error: socket hang up
       at createHangUpError (_http_client.js:254:15)
       at TLSSocket.socketOnEnd (_http_client.js:346:23)
       at emitNone (events.js:91:20)
       at TLSSocket.emit (events.js:185:7)
       at endReadableNT (_stream_readable.js:974:12)
       at _combinedTickCallback (internal/process/next_tick.js:80:11)
       at process._tickDomainCallback (internal/process/next_tick.js:128:9) code: 'ECONNRESET' },
  options: 
   { method: 'GET',
     uri: 'https://api.coinmarketcap.com/v2/ticker/?convert=BTC&start=0',
     json: true,
     callback: [Function: RP$callback],
     transform: undefined,
     simple: true,
     resolveWithFullResponse: false,
     transform2xxOnly: false },
  response: undefined }

知道为什么我的 Cloud Function 运行时会出现此套接字挂断错误吗?

编辑:这是我的云函数代码的样子:
const functions = require('firebase-functions');
// Import Admin SDK
var admin = require("firebase-admin");
var reqprom = require('request-promise');

admin.initializeApp(functions.config().firebase);

exports.minutely_tick =
  functions.pubsub.topic('minutely-tick').onPublish((event) => {
    console.log('This job runs every 5 minutes!');
    getAllData()
      .then((dataArray) => {
        const ref = admin.database().ref(`myData/`);
        ref.set(dataArray);
        return console.log('dataArray length:', dataArray.length);
      })
      .catch((error) => {
        return console.log('Caught error: ', error);
      });
  });

function getAllData() {
  return new Promise((resolve, reject) => {

    var promises = [];
    var startInt = 0;
    for (i = 0; i < 1000; i++) {
      const options = {
        method: GET,
        uri: myUrlString,
        json: true
      }
      promises.push(reqprom(options));
      startInt += 100;
    }

    Promise.all(promises)
      .then((dict) => {
        var array = valuesFromDict(dict);
        return resolve(array);
      })
      .catch((error) => {
        return reject(error);
      });
  });

}

function valuesFromDict(dict) {
  var values = Object.keys(dict).map((key) => {
    return dict[key];
  });
  return values;
}

总之,该函数在循环中进行多个 API 调用。通过 promise ,我等待所有这些完成。然后将该数据格式化为我设置为 Firebase 数据库引用的数组。

最佳答案

您不会从 promise 链中返回最终 promise 。 Cloud Functions 要求您返回一个 promise ,该 promise 仅在您的函数中完成所有异步工作时才解决。

return getAllData().then(...).catch(...)

关于firebase - Cloud Functions for Firebase 中的套接字挂断错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50630209/

相关文章:

swift - 在数据显示之前等待 1-2 秒从 Firebase 获取数据 (IOS)

java - 使用 GWT 和 GAE 解析 JSON?

python - AuthSub 与 Google 应用引擎中的 Text_db

android - 从 Flutter 应用程序连接到本地 Firebase 函数模拟器时出错

android - React-native 在 android 5.1.1 上很慢,但在旧的 5.1 上很好

javascript - firebase 获取最后创建的节点的键

google-app-engine - 将 Google App Engine 应用程序升级到灵活环境时,如何运行 Google 的 aefix 工具?

google-cloud-platform - Cloud Function 的端点返回 403 Forbidden

javascript - Firebase JS 函数似乎向变量添加前导空格

javascript - 我如何遍历此数据库并获取子值?