Обновить последний дочерний элемент в списке Firebase

Документация в Firebase JS SDK немного неясна, но из того, что я понял, если я хочу обновить последний элемент списка, мне нужно сослаться на список, подобный этому, и цепочку для обновления?

const { uid } = await firebase.auth().currentUser;

const ref = firebase
    .app()
    .database()
    .ref();

const userRef = ref
    .child('users/' + uid + '/myList')
    .orderByKey()
    .limitToLast(1)
    .update({ stamp: Date.now() });

Но без игральных костей.

// TypeError: ref.child(...).orderByKey(...).limitToLast(...).update is not a function

Обновлять:

Я ясно вижу правильное значение toString моего ref, но значение не существует в оснастке?

const { uid } = await firebase.auth().currentUser;

const ref = firebase
    .database()
    .ref('users/' + uid)
    .child('myList');

console.info(ref.toString()); // firebaseio.com/users/XtNjKhhF...lfBn2/myList

ref.on('value', function(snap) {
    console.info('snap val', snap.val()); // never called
});

// data is clearly there, no?
{
  "users" : {
    "Xt....lfABn2" : {
      "myList" : {
        "-LZDd5G2lhNv5ogv" : {
          "start" : 1550728848450
        }
      }
    }
  }
}

Что ты имеешь в виду под "без кубиков"? В чем проблема?

Doug Stevenson 22.02.2019 07:34

Последний комментарий заставил меня смеяться. Я не думаю, что @DougStevenson на самом деле спрашивал, что означает Нет кости - он спрашивал, в чем на самом деле проблема. Сообщение об ошибке в вопросе довольно ясно: .update не является функцией для этого вызова, поэтому вы вызываете то, чего не существует. В документации есть несколько конкретных примеров того, как обновлять поле — взгляните на Обновить определенные поля. Прочтите это и обновите свой код, чтобы он содержал законные вызовы API, и сообщите нам, где вы застряли.

Jay 22.02.2019 18:02

Спасибо @Jay, да, я подумал, что TypeError будет достаточно, например, «почему ошибка типа, кто-нибудь знает, как это сделать правильно?» ;). Я не вижу ничего в документации, чтобы сделать что-то подобное без предыдущей ссылки на созданный объект. Я думаю, довольно ясно, что я пытаюсь сделать, верно? Однако отсутствующий контекст может заключаться в том, что я пытаюсь выполнить независимую операцию без предыдущей ссылки на то, что находится в списке. Я просто знаю, что список существует, и хочу обновить только последний элемент. Спасибо за помощь. Полностью застрял здесь, и я знаю, что делаю это неправильно.

4m1r 22.02.2019 19:14

С firebase, если вы хотите обновить что-либо, вам нужно: а) явно знать «путь» к узлу или б) получить этот путь через наблюдение или запрос. Итак, для а) если вы хотите обновить последнее сообщение в списке сообщений, var lastPost = firebase.database().ref('posts').limitToLast(1); - это сообщение будет возвращено в виде снимка, чтобы вы знали ключ и могли затем обновить любые дочерние значения, которые вы хотите, через ссылку на этот узел. Итак, суть в том, что вам нужно обновить ссылка, а не снимок, возвращенный из запроса. Есть смысл?

Jay 22.02.2019 19:26

@Джей схожу с ума. Это должно быть так просто, верно? Даже мой обратный вызов ref не вызывается для «значения». Данные вроде есть, сделал обновление выше.

4m1r 22.02.2019 21:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
169
1

Ответы 1

Этот код возвращает снимок, но вы рассматриваете его как ссылку

const userRef = ref
    .child('users/' + uid + '/myList')
    .orderByKey()
    .limitToLast(1)

Вы не можете сделать update() на снимке

  .update({ stamp: Date.now() });

Вот почему вам нужно добавить .ref к снимку

const userRef = ref
    .child('users/' + uid + '/myList')
    .orderByKey()
    .limitToLast(1)
    .ref                            // <- this line here
    .update({ stamp: Date.now() });

нет ошибки, просто молча делает свое дело и база данных не обновляется.

4m1r 22.02.2019 19:17

можете ли вы проверить, был ли штамп добавлен к родителю как к новому ребенку? Возможно, нам потребуется передать имя дочернего элемента перед обновлением.

Mocas 23.02.2019 22:09

Другие вопросы по теме