我正在尝试构建一个应用程序,通过它的标题和它的作者来存储和显示书籍报价。我正在使用Firebase作为后端。我的Firebase数据结构如下所示。
当添加书籍报价时,我知道作者。因此,要自动将引用存储在作者中,我正在尝试使用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数据库阵列。
答案 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,您不会丢失引号顺序:它们仍将按照它们的写入顺序保存。