Firebase云功能与批量更新不一致

时间:2017-08-21 12:57:09

标签: node.js http firebase google-cloud-functions

我有我的firebase云功能,我正在调用我的外部api端点。

const functions = require('firebase-functions');
var admin = require("firebase-admin");
admin.initializeApp(functions.config().firebase);
var request = require('request');
var moment = require('moment');
var rp = require('request-promise');

var db = admin.database();

exports.onCheckIn = functions.database.ref('/news/{newsId}/{entryId}')
      .onCreate(event => {
        console.log("Event Triggered");
        var eventSnapshot = event.data.val();
        request.post({
              url: 'http://MyCustomURL/endpoint/',
              form: {
                data: eventSnapshot.data
             }
            }, function(error, response, body){

                console.log(response);

            });



      })

我正在使用Blaze计划,这完全正常。但问题是,当我创建批量数据(大约50到100个条目)时,我的自定义URL的HTTP请求无法正常工作。正在跳过一个或两个HTTP请求。

我调试了我的自定义服务器,发现它没有收到来自firebase的丢失请求。但我也检查了云功能日志,我发现每个事件都被正确触发。

可能是什么问题?我做错了吗?

1 个答案:

答案 0 :(得分:5)

您没有从函数中返回任何值。这意味着Cloud Functions假定函数在最后一个语句运行后完成其工作。但是,由于您正在函数中进行异步HTTP调用,因此调用可能尚未完成。不幸的是,你并没有告诉Cloud Functions你有一个未完成的电话,所以它可能会在你返回后的任何时候终止你的功能。

解决方案是返回在HTTP请求完成后解析的promise。由于您已经包含request-promise,因此这很简单:

exports.onCheckIn = functions.database.ref('/news/{newsId}/{entryId}')
.onCreate(event => {
  console.log("Event Triggered");
  var eventSnapshot = event.data.val();
  return rp.post({
      url: 'http://MyCustomURL/endpoint/',
      form: {
        data: eventSnapshot.data
      }
  });
})

对于刚接触JavaScript或使用JavaScript和Firebase的开发人员而言,这是一个常见问题,并在以下内容中介绍: