Firebase云function与批量更新不一致

我有我的firebase云function,我在这里调用我的外部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的计划,这是完全正常的。 但问题是,当我创build批量数据(大约50到100个条目)时,对我的自定义url的HTTP请求无法正常工作。一个或两个HTTP请求正在被跳过。

我debugging了我的自定义服务器,发现它没有收到来自Firebase的缺less请求。 但是我也检查了云function日志,我发现每个事件都被正确地触发了。

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

你没有从你的函数返回任何价值。 这意味着云端函数假设在最后一条语句运行后,函数完成了工作。 但是,由于您在该函数中进行asynchronousHTTP调用,该调用可能尚未完成。 不幸的是,您不会告诉Cloud Functions关于您有一个突出的呼叫的事实,因此您可能会在任何时候在您返回之后终止您的function。

解决scheme是返回在HTTP请求完成后parsing的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的开发者来说,这是一个常见的问题,涵盖的内容包括:

  • Firebase文档
  • 这篇博文
  • 这个video