Cloud Functions for Firebase 在完成执行前中断
Cloud Functions for Firebase interrupted before finishing execution
函数正在观察 proposals/{jobid}/{propid}
。当添加新提案且 child("isinvitation")
为空时,该函数成功将新节点写入 proposals/sent
,然后向作业 jobs/${jobid}
.
的提案子节点添加增量
删除提案时函数失败。 userRef.child(jobid).remove()
也未被触发,减少到工作 jobs/${jobid}
的建议子项不会发生。
exports.CountProposals = functions.database.ref("/proposals/{jobid}/{propid}").onWrite((event) => {
const jobid = event.params.jobid;
const userId = event.params.propid;
const isinvitation = event.data.child("isinvitation").val();
if (!isinvitation) {
const userRef = admin.database().ref(`users/${userId}/proposals/sent`);
if (event.data.exists() && !event.data.previous.exists()) {
userRef.child(jobid).set({
timestamp: admin.database.ServerValue.TIMESTAMP
});
} else if (!event.data.exists() && event.data.previous.exists()) {
userRef.child(jobid).remove();
}
}
const collectionRef = admin.database().ref(`/jobs/${jobid}`);
return collectionRef.once('value').then(snapshot => {
if (snapshot.val() !== null) {
const countRef = collectionRef.child("proposals");
countRef.transaction(current => {
if (event.data.exists() && !event.data.previous.exists()) {
return (current || 0) + 1;
} else if (!event.data.exists() && event.data.previous.exists()) {
return (current || 0) - 1;
}
});
}
});
});
Console log don't show any errors.
"Event handler that fires every time a Firebase Realtime Database write occurs." - https://firebase.google.com/docs/reference/functions/functions.database.RefBuilder#onWrite
我个人希望这也会在删除操作时触发,但是,它可能类似于 AngularFire,其中 write
操作不被视为 remove
操作。
您可以看看这个,看看如何让它适应您的情况:https://firebase.google.com/docs/reference/functions/functions.database.DeltaSnapshot#changed
编辑: 在尝试了我自己的一些功能后,它们似乎会在我删除时触发。我会更多地研究你的代码。
您的函数正尝试在多个位置进行多次写入。这些写入中的每一个都将生成一个不同的承诺来跟踪其完成。您应该 return 一个在 所有 工作完成时解决的承诺。就目前而言,您只是 return 来自 collectionRef.once('value').then()
的单一承诺,它本身并不是 return 跟踪交易完成的另一个承诺。
基本上,您需要小心跟踪所有带有承诺的写入,通常您使用 Promise.all() 来等待所有未完成的工作。
函数正在观察 proposals/{jobid}/{propid}
。当添加新提案且 child("isinvitation")
为空时,该函数成功将新节点写入 proposals/sent
,然后向作业 jobs/${jobid}
.
删除提案时函数失败。 userRef.child(jobid).remove()
也未被触发,减少到工作 jobs/${jobid}
的建议子项不会发生。
exports.CountProposals = functions.database.ref("/proposals/{jobid}/{propid}").onWrite((event) => {
const jobid = event.params.jobid;
const userId = event.params.propid;
const isinvitation = event.data.child("isinvitation").val();
if (!isinvitation) {
const userRef = admin.database().ref(`users/${userId}/proposals/sent`);
if (event.data.exists() && !event.data.previous.exists()) {
userRef.child(jobid).set({
timestamp: admin.database.ServerValue.TIMESTAMP
});
} else if (!event.data.exists() && event.data.previous.exists()) {
userRef.child(jobid).remove();
}
}
const collectionRef = admin.database().ref(`/jobs/${jobid}`);
return collectionRef.once('value').then(snapshot => {
if (snapshot.val() !== null) {
const countRef = collectionRef.child("proposals");
countRef.transaction(current => {
if (event.data.exists() && !event.data.previous.exists()) {
return (current || 0) + 1;
} else if (!event.data.exists() && event.data.previous.exists()) {
return (current || 0) - 1;
}
});
}
});
});
Console log don't show any errors.
"Event handler that fires every time a Firebase Realtime Database write occurs." - https://firebase.google.com/docs/reference/functions/functions.database.RefBuilder#onWrite
我个人希望这也会在删除操作时触发,但是,它可能类似于 AngularFire,其中 write
操作不被视为 remove
操作。
您可以看看这个,看看如何让它适应您的情况:https://firebase.google.com/docs/reference/functions/functions.database.DeltaSnapshot#changed
编辑: 在尝试了我自己的一些功能后,它们似乎会在我删除时触发。我会更多地研究你的代码。
您的函数正尝试在多个位置进行多次写入。这些写入中的每一个都将生成一个不同的承诺来跟踪其完成。您应该 return 一个在 所有 工作完成时解决的承诺。就目前而言,您只是 return 来自 collectionRef.once('value').then()
的单一承诺,它本身并不是 return 跟踪交易完成的另一个承诺。
基本上,您需要小心跟踪所有带有承诺的写入,通常您使用 Promise.all() 来等待所有未完成的工作。