如何将外部请求的结果推送到 firebase 中的 realtimeDB?

达汉·理查森

我正在尝试发出 SOAP 请求,并将结果推送到 firebase 数据库。

我编写了一个函数,该函数在使用 node index.js 调用时可以正常工作以 console.log 我的 SOAP 请求的结果。

我有一个在 HTTPS 请求上触发的 firebase 函数。这个函数调用了我的,但没有数据被推送到数据库。

function getStopData(){
  (async () => {
    const { response } = await soapRequest(url, headers, xml); // Optional timeout parameter(milliseconds)
    const { body, statusCode } = response;

    parseString(body, function (err, result) {
        var envelope = result['soap:Envelope'];
        var body = envelope['soap:Body'];
        var result = body.pop();
        var resultXml = result.GetRealTimeStopDataResponse.pop().GetRealTimeStopDataResult.pop()

        var stopData = resultXml['diffgr:diffgram'].pop().DocumentElement.pop().StopData;
        var busses = []
        for (bus in stopData) {
          delete stopData[bus].$
          busses.push(stopData[bus]);
        }
        admin.database().ref('/test14').push({testText: 'test14Text'});
    });
  })();
}

admin.initializeApp();

exports.test14 = functions.region('europe-west1')
.https.onRequest(async (req, res) => {
  getStopData(); //Runs function, but no test is pushed to DB
  admin.database().ref('/test14').push({testText: 'test14Text'}); //This is pushed to dB
  return res.send("Success");
});

测试字符串是推送的 firebase 函数。常规函数中的测试字符串不是。

提前致谢。

如果 firebase 不适合此应用程序,请提出任何其他建议。我正在尝试创建一个每 2 分钟运行一次的函数来发出 SOAP 请求并存储结果。

编辑:根据第一个答案,我修改了我的代码以匹配建议。这给我留下了不同的错误..

 5:25:49.623 PM
test14
SOAP FAIL: Error: timeout of 10000ms exceeded

5:25:49.624 PM
test14
Unhandled rejection

5:25:49.624 PM
test14
Error: timeout of 10000ms exceeded at createError (/srv/node_modules/axios-https-proxy-fix/lib/core/createError.js:16:15) at Timeout.handleRequestTimeout [as _onTimeout] (/srv/node_modules/axios-https-proxy-fix/lib/adapters/http.js:216:16) at ontimeout (timers.js:498:11) at tryOnTimeout (timers.js:323:5) at Timer.listOnTimeout (timers.js:290:5)

5:25:49.631 PM  
test14
Function execution took 10712 ms, finished with status: 'crash' 

我不确定为什么会出现 SOAP Fail,因为使用 node index.js 运行仍然会产生记录到控制台的正确数据。

  MonitoredVehicleJourney_Monitored: [ 'true' ],
    MonitoredVehicleJourney_InCongestion: [ 'false' ],
    MonitoredVehicleJourney_BlockRef: [ '37006' ],
    MonitoredVehicleJourney_VehicleRef: [ '44138' ],
    MonitoredCall_VisitNumber: [ '4' ],
    MonitoredCall_VehicleAtStop: [ 'false' ],
    MonitoredCall_AimedArrivalTime: [ '2019-04-14T18:19:45+01:00' ],
    MonitoredCall_ExpectedArrivalTime: [ '2019-04-14T18:19:45+01:00' ],
    MonitoredCall_AimedDepartureTime: [ '2019-04-14T18:19:45+01:00' ],
    MonitoredCall_ExpectedDepartureTime: [ '2019-04-14T18:19:45+01:00' ],
    Timestamp: [ '2019-04-14T17:34:14.97+01:00' ],
    LineNote: [ '' ] } ]
弗兰克·范·普费伦

当您在 Cloud Functions 上运行代码时,您需要为其运行的时间付费。出于这个原因,Cloud Functions 运行时将在您将响应发送回调用客户端后立即终止容器,您使用return res.send("Success").

但是您的 SOAP 调用是异步发生的,并在res.send运行后继续在这种情况下,您必须在完成后告诉 Cloud Functions。由于您不这样做,因此 Cloud Functions 可能会随时终止运行您的代码的容器,并且显然在这种情况下会在您的 SOAP 请求完成之前发生。

解决方案是仅在 SOAP 调用的结果返回时才写入响应:

function getStopData(){
  (async () => {
    const { response } = await soapRequest(url, headers, xml); // Optional timeout parameter(milliseconds)
    const { body, statusCode } = response;

    parseString(body, function (err, result) {
        var envelope = result['soap:Envelope'];
        var body = envelope['soap:Body'];
        var result = body.pop();
        var resultXml = result.GetRealTimeStopDataResponse.pop().GetRealTimeStopDataResult.pop()

        var stopData = resultXml['diffgr:diffgram'].pop().DocumentElement.pop().StopData;
        var busses = []
        for (bus in stopData) {
          delete stopData[bus].$
          busses.push(stopData[bus]);
        }
        admin.database().ref('/test14').push({testText: 'test14Text'}).then(() => {
          res.send("Success");
        });
    });
  })();
}

admin.initializeApp();

exports.test14 = functions.region('europe-west1')
.https.onRequest(async (req, res) => {
  getStopData(res);
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在不覆盖FireBase RealTimeDB中现有对象的情况下导入Json数组

来自分类Dev

需要一种将特定数据从Firebase RealtimeDB提取到Google表格的方法

来自分类Dev

Firebase检测连接状态并同时连接到realtimeDB

来自分类Dev

如何使用Firebase将新项目推送到数组中

来自分类Dev

如何将 Firebase Cloud Storage 中返回项目的 URL 推送到 Angular 中的数组中?

来自分类Dev

如何防止恶意用户将数据推送到 Firebase 中的文档中?

来自分类Dev

如何将数据推送到数据库的异步请求中的数组?

来自分类Dev

如何将angularfire(angular + firebase)项目推送到heroku?

来自分类Dev

将新对象推送到Firebase中时如何设置自定义ID

来自分类Dev

将Firebase数据推送到数组+ js + vuejs中

来自分类Dev

Xcode - 将数据推送到 Firebase 存储中

来自分类Dev

如何在Angular 8中将firebase jwt getIdToken发送到http get请求?

来自分类Dev

如何将新元素动态推送到列表中

来自分类Dev

如何将数组数据推送到数据属性中

来自分类Dev

如何将分支推送到单独的远程仓库中?

来自分类Dev

如何将数组推送到对象数组中?

来自分类Dev

如何将标签推送到CI中的分支?

来自分类Dev

如何将数据推送到数组mongodb中?

来自分类Dev

如何将文件推送到存储库中的目录

来自分类Dev

如何将项目推送到 Kotlin 中的数组?

来自分类Dev

如何将Firebase数据库中的Google登录信息发送到导航抽屉?

来自分类Dev

如何将字符串从 php firebase 通知发送到 android 中的通知服务?

来自分类Dev

如何将所有服务器请求重定向到Firebase Hosting中的功能

来自分类Dev

如何将Firebase查询的结果存储到Promise中的变量?

来自分类Dev

如何将表单提交的日期/时间推送到 Firebase 数据库

来自分类Dev

当Firebase有新条目时,如何将通知推送到客户端?

来自分类Dev

如何将列表推送到 Firebase 实时数据库

来自分类Dev

如何在Flutter中通过HTTP Post请求将AuthPayload发送到Firebase Realtime-Database

来自分类Dev

React Native Firebase - 将数据推送到数组,允许在 FlatList 中显示

Related 相关文章

  1. 1

    如何在不覆盖FireBase RealTimeDB中现有对象的情况下导入Json数组

  2. 2

    需要一种将特定数据从Firebase RealtimeDB提取到Google表格的方法

  3. 3

    Firebase检测连接状态并同时连接到realtimeDB

  4. 4

    如何使用Firebase将新项目推送到数组中

  5. 5

    如何将 Firebase Cloud Storage 中返回项目的 URL 推送到 Angular 中的数组中?

  6. 6

    如何防止恶意用户将数据推送到 Firebase 中的文档中?

  7. 7

    如何将数据推送到数据库的异步请求中的数组?

  8. 8

    如何将angularfire(angular + firebase)项目推送到heroku?

  9. 9

    将新对象推送到Firebase中时如何设置自定义ID

  10. 10

    将Firebase数据推送到数组+ js + vuejs中

  11. 11

    Xcode - 将数据推送到 Firebase 存储中

  12. 12

    如何在Angular 8中将firebase jwt getIdToken发送到http get请求?

  13. 13

    如何将新元素动态推送到列表中

  14. 14

    如何将数组数据推送到数据属性中

  15. 15

    如何将分支推送到单独的远程仓库中?

  16. 16

    如何将数组推送到对象数组中?

  17. 17

    如何将标签推送到CI中的分支?

  18. 18

    如何将数据推送到数组mongodb中?

  19. 19

    如何将文件推送到存储库中的目录

  20. 20

    如何将项目推送到 Kotlin 中的数组?

  21. 21

    如何将Firebase数据库中的Google登录信息发送到导航抽屉?

  22. 22

    如何将字符串从 php firebase 通知发送到 android 中的通知服务?

  23. 23

    如何将所有服务器请求重定向到Firebase Hosting中的功能

  24. 24

    如何将Firebase查询的结果存储到Promise中的变量?

  25. 25

    如何将表单提交的日期/时间推送到 Firebase 数据库

  26. 26

    当Firebase有新条目时,如何将通知推送到客户端?

  27. 27

    如何将列表推送到 Firebase 实时数据库

  28. 28

    如何在Flutter中通过HTTP Post请求将AuthPayload发送到Firebase Realtime-Database

  29. 29

    React Native Firebase - 将数据推送到数组,允许在 FlatList 中显示

热门标签

归档