Документация в 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
}
}
}
}
}
Последний комментарий заставил меня смеяться. Я не думаю, что @DougStevenson на самом деле спрашивал, что означает Нет кости - он спрашивал, в чем на самом деле проблема. Сообщение об ошибке в вопросе довольно ясно: .update не является функцией для этого вызова, поэтому вы вызываете то, чего не существует. В документации есть несколько конкретных примеров того, как обновлять поле — взгляните на Обновить определенные поля. Прочтите это и обновите свой код, чтобы он содержал законные вызовы API, и сообщите нам, где вы застряли.
Спасибо @Jay, да, я подумал, что TypeError будет достаточно, например, «почему ошибка типа, кто-нибудь знает, как это сделать правильно?» ;). Я не вижу ничего в документации, чтобы сделать что-то подобное без предыдущей ссылки на созданный объект. Я думаю, довольно ясно, что я пытаюсь сделать, верно? Однако отсутствующий контекст может заключаться в том, что я пытаюсь выполнить независимую операцию без предыдущей ссылки на то, что находится в списке. Я просто знаю, что список существует, и хочу обновить только последний элемент. Спасибо за помощь. Полностью застрял здесь, и я знаю, что делаю это неправильно.
С firebase, если вы хотите обновить что-либо, вам нужно: а) явно знать «путь» к узлу или б) получить этот путь через наблюдение или запрос. Итак, для а) если вы хотите обновить последнее сообщение в списке сообщений, var lastPost = firebase.database().ref('posts').limitToLast(1); - это сообщение будет возвращено в виде снимка, чтобы вы знали ключ и могли затем обновить любые дочерние значения, которые вы хотите, через ссылку на этот узел. Итак, суть в том, что вам нужно обновить ссылка, а не снимок, возвращенный из запроса. Есть смысл?
@Джей схожу с ума. Это должно быть так просто, верно? Даже мой обратный вызов ref не вызывается для «значения». Данные вроде есть, сделал обновление выше.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Этот код возвращает снимок, но вы рассматриваете его как ссылку
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() });
нет ошибки, просто молча делает свое дело и база данных не обновляется.
можете ли вы проверить, был ли штамп добавлен к родителю как к новому ребенку? Возможно, нам потребуется передать имя дочернего элемента перед обновлением.
Что ты имеешь в виду под "без кубиков"? В чем проблема?