我有我的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的丢失请求。但我也检查了云功能日志,我发现每个事件都被正确触发。
可能是什么问题?我做错了吗?
答案 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的开发人员而言,这是一个常见问题,并在以下内容中介绍: