Nano Hash - криптовалюты, майнинг, программирование

Как получить документ по ID после вставки?

Идея проста. Пользователь добавляет новый документ в коллекцию, а затем хочет, чтобы он отображался на странице без обновления. Я знаю, что могу синхронизировать все документы с onSnapshot, но это очень важно, прямо сейчас я просто хочу получить вставленный документ ID.

addWish = function() {
    let wish = document.getElementById("wish-text").value;
    if (wish && this.checkSignedIn()) {
        this.database.collection("wishes").add({
            wish: wish,
            author: this.user.name,
            date: 0 - Date.now(),
            voteup: 1,
            votedown: 0
        }).then(function(docRef) {
            console.log("Document written with ID: ", docRef.id);
            this.database.collection('wishes').doc(docRef.id).get().then(function (documentSnapshots) {
                this.renderWishes(documentSnapshots, 1);
            }.bind(this)).catch(function(error) {
                console.error("Error getting document: ", error);
            });
         }.bind(this)).catch(function(error) {
          console.error("Error adding document: ", error);
    });

Функция renderWishes не работает на одной из первых строк. И тогда все остальное тоже не работает, например foreach:

renderWishes = function(querySnapshot, type) {
    console.log(querySnapshot.docs[0].data());
    querySnapshot.forEach(function(doc) {
        let id = doc.id;
        doc = doc.data(); //and after I simply display data with templates ${doc.author}

Ошибка при получении документа: TypeError: невозможно прочитать свойство «0» неопределенного

А также

foreach`: "firebase.js:131 Ошибка при получении документа: TypeError: querySnapshot.forEach не является функцией

Есть ли шанс исправить это? Или нельзя получить документ по ID из Firestore?


  • Единственный показанный экземпляр querySnapshot находится в вызове console.log(), который не работает. Где именно вы это определяете? 16.01.2018
  • @ Альваро Гонсалес обновлен. Он передан в функцию. И я знаю, что это на самом деле работает, потому что есть еще одна функция, которая правильно отображает все документы при обновлении, но когда я пытаюсь получить один из них по идентификатору, я получаю сообщение об ошибке. 16.01.2018
  • Похоже, вам не хватает кода. Первая строка начинается с .then(). Какой звонок непосредственно перед ним породил обещание, на которое вы хотели бы ответить? 16.01.2018
  • @Doug Stevenson Я пропустил это, потому что все до console.log("Document written with ID: ", docRef.id); работало отлично, и я видел этот идентификатор в консоли. Но я не мог использовать его, чтобы продвинуться дальше. Я обновил вопрос с дополнительным кодом. Если вам нужно больше, я предоставлю больше, я не уверен, что именно нужно. Я думал, что проблема очевидна и лежит где-то посередине, но это кажется намного сложнее... 16.01.2018
  • У меня такое ощущение, что вы обращаетесь только к одному документу. Можете ли вы попробовать использовать console.log(querySnapshot.data()); вместо console.log(querySnapshot.docs[0].data()); в своем renderWishes? 16.01.2018
  • На самом деле ничего не изменилось. Без какого-либо вывода на консоль я получаю эту ошибку для foreach: firebase.js:131 Error getting document: TypeError: querySnapshot.forEach is not a function и на ваш код он отвечает: Uncaught (in promise) TypeError: Cannot read property 'data' of undefined и останавливает код там. И это должен быть один документ. Я пытаюсь получить один документ с собственным идентификатором для загрузки и отображения информации. Foreach создан для другой функции для отображения 10 документов при загрузке страницы. Но это еще не проблема. Запрос проходит undefined по какой-то причине... 16.01.2018
  • @ Rosário Pereira Fernandes проблема должна быть где-то в запросе. Сразу после обновления другая функция уже отображает новый документ из БД, но эта штука отказывается скачивать его со своим ID. А другая функция просто перечисляет документы по порядку: this.database.collection("wishes").orderBy("date").limit(10);. 16.01.2018
  • Не могли бы вы немного прокомментировать forEach? Просто чтобы проверить, печатает ли он первый журнал 16.01.2018
  • @ Rosário Pereira Fernandes, вы имеете в виду весь foreach или только оператора? Если только оператор, то смысла нет, console.log, который мы только что добавили, сначала вызывает ошибку (хотя я пытался). Также я не могу удалить foreach, чтобы код работал сам по себе, потому что этот querySnapshot.doc.data() не работает, в то время как я делаю это по-другому в foreach, и там он работает: querySnapshot.forEach(function(doc) { let id = doc.id; doc = doc.data(); Я добавил эти несколько строк в вопрос. 16.01.2018

Ответы:


1

Результат асинхронного get() операция возвращает объект, который отличается от того, что вы ожидаете в своем коде.

В своем коде вы помещаете следующий объект в новый документ:

    {
        wish: wish,
        author: this.user.name,
        date: 0 - Date.now(),
        voteup: 1,
        votedown: 0
    }

Когда вы получаете () этот документ сразу после добавления (), переменная, которую вы вызываете querySnapshot, будет содержать DocumentSnapshot с точно таким же содержимым взамен. DocumentSnapshot не имеет свойства docs, к которому вы пытаетесь получить доступ. Вот почему вы получаете сообщение об ошибке, что оно не определено. DocumentSnapshot имеет свойство id, которое дает вам идентификатор документа, который вы только что получили.

16.01.2018
  • Но каково решение? Вывод console.log(documentSnapshots); выглядит пугающе и содержит много всего внутри, в то время как я не могу получить то, что мне нужно, например documentSnapshots.wish или documentSnapshots.doc.wish. Кроме того, текст в вашем ответе немного странный, поэтому я мог пропустить фактическое решение... 17.01.2018
  • Извините, у меня была неверная информация. Я обновил ответ. 17.01.2018
  • Ага, понятно. Значит, я не могу получить ничего, кроме id таким образом? Таким образом, есть только два способа получить это новое сообщение, используя onSnapshot или функции HTTP? Или обновить. 17.01.2018
  • Посмотрите документацию, на которую я дал ссылку для DocumentSnapshot, чтобы увидеть, что еще она вам дает. Существует метод data(), который дает вам содержимое документа. В этом весь смысл использования get(). 17.01.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..