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

San*_*agi 2 http node.js 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);

            });



      })
Run Code Online (Sandbox Code Playgroud)

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

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

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

Fra*_*len 6

你没有从函数中返回任何值.这意味着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
      }
  });
})
Run Code Online (Sandbox Code Playgroud)

对于刚接触JavaScript或使用JavaScript和Firebase的开发人员来说,这是一个常见问题,其内容包括: