我为Google Cloud函数编写了这个节点js函数,以将Firebase数据库节点条目索引到Algolia。
exports.indexlisting_algolia =
functions.database.ref('/Listings/{listingId}')
.onWrite((change, context) => {
const index = algolia.initIndex('Listings');
const before = change.before; // snapshot before the update
const after = change.after; // snapshot after the update
const before_data = before.val();
const after_data = after.val();
after_data.objectID = context.params.listingId;
console.log(Date.now());
console.log(context)
return index.saveObject(after_data)
.then(
() => change.after.ref.child('last_index_timestamp').set(
Date.parse(context.timestamp)));
})
该函数有效,但不会停止执行,只是不断重复自身。有什么问题,我该如何解决?
答案 0 :(得分:0)
通过执行change.after.ref.child('last_index_timestamp').set()
,您正在写您正在Cloud Function中监听的参考。因此,Cloud Function会自动触发。
您应该在函数的开头检查是否需要执行该函数。
您很可能会使用last_index_timestamp
和/或change.before.val()
检查change.after.val()
是否存在或具有特定值。
如果要停止执行功能,只需返回null
。
有关此“技术”的示例,请参见以下官方示例(第30至32行)https://github.com/firebase/functions-samples/blob/952fe5d08c0a416f78def93fa337ca2bd73aedcf/message-translation/functions/index.js
最后(重要)说明:您应返回set()
方法返回的promise并捕获潜在的错误,如下所示:
return index.saveObject(after_data)
.then(
() => return change.after.ref.child('last_index_timestamp').set(Date.parse(context.timestamp))
)
.catch(err => {
console.log('Error:', err);
return false;
});
我建议您观看以下官方视频系列“学习Firebase的云功能”(请参阅https://firebase.google.com/docs/functions/video-series/),尤其是三个标题为“学习JavaScript承诺”的视频,它们说明了我们应该如何以及为什么在事件触发的Cloud Functions中链接并返回承诺。