我在实时数据库的一个节点上检测到某种递归,我想删除(或设置为null)该特定节点。到目前为止,这是我的firebase函数:
exports.cleanForms = functions.https.onRequest((req, res) => {
const parentRef = admin.database().ref("forms");
return parentRef.once('value').then(snapshot => {
snapshot.forEach(function(child) {
admin.database().ref('forms/'+child.key+'/user/forms').set(null);
});
});
});
基本上,它应该遍历forms节点内的所有记录并删除其user / forms属性。
但是通过转到以下URL调用该函数:https://.cloudfunctions.net/cleanForms给我这个错误:
错误:无法处理请求
这是我在日志中看到的:
10:47:57.818 PM cleanForms函数执行耗时13602 ms,已完成 状态:“连接错误”
forms节点具有少于3,000条记录,但是正如我之前提到的,它具有一定的递归性。我不知道它是否由于大小或与此有关而失败。
答案 0 :(得分:0)
您正在使用HTTPs云功能:因此,您必须“最后向客户端发送响应”(观看道格·史蒂文森的官方视频以获取更多详细信息:https://youtu.be/7IkUgCLr5oA) 。
在您的情况下,函数的“结束”将是您的所有set()异步操作都将“完成”时。由于set()
方法返回了Promise,因此您必须使用Promise.all()
(再次观看此官方视频:https://youtu.be/d9GrysWH1Lc)。
因此,以下方法应该起作用(但是未经测试):
exports.cleanForms = functions.https.onRequest((req, res) => {
const parentRef = admin.database().ref("forms");
parentRef.once('value')
.then(snapshot => {
const promises = [];
snapshot.forEach(child => {
promises.push(admin.database().ref('forms/'+child.key+'/user/forms').set(null));
});
return Promise.all(promises)
.then(results => {
response.send({result: results.length + ' node(s) deleted'});
})
.catch(error => {
response.status(500).send(error);
});
});