如何使用javascript中的Firebase函数插入现有的Firebase数据库阵列

时间:2018-04-27 08:17:37

标签: firebase firebase-realtime-database google-cloud-functions

我正在尝试构建一个应用程序,通过它的标题和它的作者来存储和显示书籍报价。我正在使用Firebase作为后端。我的Firebase数据结构如下所示。

enter image description here

当添加书籍报价时,我知道作者。因此,要自动将引用存储在作者中,我正在尝试使用Firebase函数。

我尝试了两种方法,

在书籍更新时,将作者的引文与书中的引号合并。

exports.newQuotesTrigger = functions.database.ref('library/{bookAndAuthor}').onWrite((snap, context) => {
    const message = snap;
    console.log('Retrieved message content: ', message);

    const newValue = message.after.val();
    const oldValue = message.before.val();

    const author = snakeCase(newValue.author);
    admin.database().ref('authors/' + author).child('quotes').set(newValue.quotes);
    console.log('Updated author quotes');

    return message;
});

只需推断书中新引号和旧引号的区别

exports.newQuotesTrigger = functions.database.ref('library/{bookAndAuthor}').onWrite((snap, context) => {
    const message = snap;
    console.log('Retrieved message content: ', message);

    const newValue = message.after.val();
    const oldValue = message.before.val();

    const newQuotes = newValue.quotes || [];
    const oldQuotes = oldValue.quotes || [];
    const diff = arrayDiff(newQuotes, oldQuotes);

    if (diff) {
        console.log('Quotes were updated for ', {title: newValue.title, author: newValue.author});
        const author = snakeCase(newValue.author);
        admin.database().ref('authors/' + author).child('quotes').push(diff);
        console.log('Updated author quotes');
    }

    return message;
});

两者都没有正确附加/插入更新引号。我还没有找到一种方法来附加/插入Firebase数据库阵列。

1 个答案:

答案 0 :(得分:2)

您必须使用更新才能更新节点的特定子节点而不覆盖其他子节点",请参阅:

https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields

如果您稍微更改结构,那么您的第一段代码应该可以使用更新,如下所示,引号的自动生成ID

<强>数据库

author
    - nassim
      - quoteID1: "...."  <- ID auto generated
      - quoteID2: "...."  <- ID auto generated
      - quoteID3: "...."  <- ID auto generated

云功能

在您的第一个代码版本中替换这些行

    admin.database().ref('authors/' + author).child('quotes').set(newValue.quotes);
    console.log('Updated author quotes');
    return message;

那些

  const quotesObject = newValue.quotes;
  var updates = {};      

  Object.keys(quotesObject).forEach(function (key) {
    let quote = quotesObject[key];
    const newQuoteKey = firebase.database().ref('authors/' + author).child('quotes').push().key;
    updates[newQuoteKey] = quote ;
  });

  return admin.database().ref('authors/' + author).child('quotes').update(updates);

另一个重要的一点是,您没有在云功能中返回承诺。您应该从更新(或设置)而不是消息返回承诺。见https://www.youtube.com/watch?v=652XeeKNHSk&t=26s

如果你真的必须保留自己生成的引号id(即0,1,2等),你必须通过获取前面的数组值来操作数组,添加新引号并覆盖用新数组现有的报价集......付出了很多努力!特别是对于使用自动生成的ID,您不会丢失引号顺序:它们仍将按照它们的写入顺序保存。