Как передать sh дочернему узлу при обновлении значений в родительском узле Firebase RealTime - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь обновить значения в родительском узле базы данных реального времени firebase, одновременно отправляя данные на дочерний узел, однако получаю сообщение об ошибке «Ошибка Reference.update: первый аргумент содержит путь / xyz, который является предком другой путь /xyz/.../..."

const updatedPosition = {
            category: values.category,
            shares: newShares,
            cost: newCost,
        }

let updates = {}
const newTransactionKey = docRef.child('transactions').push().key;
updates[ticker + '/transactions/' + newTransactionKey] ={
                        date: new Date().toString(),
                        transaction: `${Number(values.shares)} shares added @ $${perShare} ea`
                    }
updates[ticker] = updatedPosition;
let updateSuccess = true;
await docRef.update(updates, (error) => {
    console.log(error);
    if (error){
        updateSuccess = false;
       }
});

И мои данные структурированы так:

parentNode: {
    category: "string",
    shares: "number",
    cost: "number",
    transactions: {
        0:{
            date: DateString,
            type: "string"
          }
    }
}

1 Ответ

0 голосов
/ 05 августа 2020

Ваш updates содержит эти два ключа:

${ticker}/transactions/${newTransactionKey}
${ticker}

Это помогает понять, что база данных реального времени обрабатывает обновление с несколькими местоположениями как список операторов set. Итак, первая строка устанавливает значение для глубокого ключа под ${ticker}, а затем вторая строка устанавливает значение ${ticker}.

Это означает, что второй ключ полностью перезапишет первый ключ. Поскольку это всегда так, это ошибка программирования, и база данных отклоняет ее.

Если вы хотите обновить category, shares и cost в рамках обновления, вам понадобится чтобы добавить их по отдельности:

let updates = {}
const newTransactionKey = docRef.child('transactions').push().key;
updates[`${ticker}/transactions/${newTransactionKey}`] ={
    date: new Date().toString(),
    transaction: `${Number(values.shares)} shares added @ $${perShare} ea`
}
updates[`${ticker}/category`] = values.category;
updates[`${ticker}/shares`] = newShares;
updates[`${ticker}/cost`] = newCost;

Теперь есть 4 отдельных обновления под ${ticker}, и ни одно из них не пересекается с другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...