节点js函数无法停止执行

时间:2018-09-07 07:40:32

标签: node.js firebase firebase-realtime-database google-cloud-functions

我为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)));


}) 

该函数有效,但不会停止执行,只是不断重复自身。有什么问题,我该如何解决?

1 个答案:

答案 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中链接并返回承诺。