Как включить офлайн-данные в firestore для Интернета

Я хочу включить офлайн-данные в свой проект. Я нашел для этого правильный код, но не знаю, где его реализовать.

Реализую код внутри файла firebaseConfig.js:

import firebase from 'firebase'
import 'firebase/firestore'

// firebase init
// init code goes here
var config = {
 apiKey: '',
 authDomain: '',
 databaseURL: '',
 projectId: '',
 storageBucket: '',
 messagingSenderId: ''
} 
firebase.initializeApp(config)

firebase.firestore().enablePersistence()
 .then(function () {
   // Initialize Cloud Firestore through firebase
   var db = firebase.firestore();
 })
 .catch(function (err) {
   console.info(err)
 })

 // firebase utils
 const db = firebase.firestore()
 const oldRealTimeDb = firebase.database()
 const auth = firebase.auth()
 const currentUser = auth.currentUser

 // date issue fix according to firebase
 const settings = {
   timestampsInSnapshots: true
 }
 db.settings(settings)

 // firebase collections
 const usersCollection = db.collection('users')
 const postsCollection = db.collection('posts')

export {
 db,
 auth,
 currentUser,
 postsCollection,
 usersCollection

}

main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import {store} from './store'
import './registerServiceWorker'
import Vuetify from 'vuetify'
import 'vuetify/dist/vuetify.min.css' // Ensure you are using css-loader 
const fb = require('./firebaseConfig.js')

Vue.config.productionTip = false

export const bus = new Vue()

Vue.use(Vuetify)

let app
fb.auth.onAuthStateChanged(user => {
 if (!app) {
  app = new Vue({
   el: '#app',
   store,
   router,
   template: '<App/>',
   components: {
     App
   },
   render: h => h(App)
 }).$mount('#app')
}
})

У меня такая ошибка:

Как включить офлайн-данные в firestore для Интернета

Если я не ошибаюсь, Лукас, вы используете Vue.js. Можете ли вы поделиться своим файлом main.js (и, возможно, всеми файлами, которые требуются в main.js)

Renaud Tarnec 09.08.2018 17:02
Поведение ключевого слова "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
1
1 393
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Просто удалите второй firebase.firestore() и вызовите enablePersistence следующим образом:

import firebase from 'firebase'
import 'firebase/firestore'

// firebase init
// init code goes here
var config = {
 apiKey: '',
 authDomain: '',
 databaseURL: '',
 projectId: '',
 storageBucket: '',
 messagingSenderId: ''
} 
firebase.initializeApp(config)

const db = firebase.firestore();
const auth = firebase.auth();
const currentUser = auth.currentUser;

// date issue fix according to firebase
const settings = {
  timestampsInSnapshots: true
};
db.settings(settings);
db.enablePersistence();

// firebase utils
//const db = firebase.firestore() // <---- Remove this line
const oldRealTimeDb = firebase.database()
const auth = firebase.auth()
const currentUser = auth.currentUser

Да, это то, что я делал раньше, но та же ошибка

Lukas 09.08.2018 17:18

Я думаю, вам стоит продвинуться вверх по db.settings(settings)

Renaud Tarnec 09.08.2018 17:19

Я внес несколько дополнительных изменений. Можете ли вы подтвердить, что все в порядке (пока я не могу проверить)

Renaud Tarnec 09.08.2018 17:22

он будет работать, но не для db.collection () ... -> 'collection' неопределенных

Lukas 09.08.2018 17:27

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

Renaud Tarnec 09.08.2018 17:28

если я изменю const usersRef = db.collection ('users') на => const usersCollection = firebase.firestore (). collection ('users'), тогда он будет работать

Lukas 09.08.2018 17:28

Позвольте нам продолжить обсуждение в чате.

Renaud Tarnec 09.08.2018 17:30

Как этот код может работать надежно? Обещание, возвращенное из enablePersistence, игнорируется. Сохранение фактически не включается, пока обещание не будет успешно разрешено. firebase.google.com/docs/reference/js/…

Doug Stevenson 09.08.2018 17:43
Ответ принят как подходящий

Пример кода, представленный в документация, предполагает, что вы должны вызвать enablePersistence () и, возможно, отметить, если он не работает по какой-либо определенной причине:

firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FIRESTORE PROJECT ID ###',
});

firebase.firestore().enablePersistence()
  .catch(function(err) {
      if (err.code == 'failed-precondition') {
          // Multiple tabs open, persistence can only be enabled
          // in one tab at a a time.
          // ...
      } else if (err.code == 'unimplemented') {
          // The current browser does not support all of the
          // features required to enable persistence
          // ...
      }
  });

Последующие запросы после вызова enablePersistence() будут помещаться во внутреннюю очередь до полного завершения, что означает, что запрос может использовать или не использовать локально кэшированные данные, в зависимости от результата enablePersistence(). Если для вашего приложения важно иметь возможность использовать локальное постоянство, вы можете дождаться его результата (запуск по возвращенному обещанию) перед выполнением запроса.

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

Doug Stevenson 09.08.2018 17:44

и как мне узнать, что первые примеры не сработают?

Lukas 09.08.2018 17:47

Может ли ваш запрос, который происходит сразу после вызова enablePersistence (), получить кэшированные данные при отсутствии подключения к Интернету? В противном случае настойчивость не работает.

Doug Stevenson 09.08.2018 17:48

Я только что обсудил это с командой клиентов Firestore. Похоже, что исходный образец кода вводил в заблуждение. На самом деле нет необходимости ждать результатов обещания, возвращаемого enablePersistence (), чтобы сделать первый запрос. Запросы будут помещаться во внутреннюю очередь до полного завершения enablePersistence (). Пример кода в документации скоро будет обновлен. Я тоже обновлю свой ответ.

Doug Stevenson 09.08.2018 20:16

Можете ли вы взглянуть на это с обработкой статуса онлайн / офлайн, пожалуйста: stackoverflow.com/questions/51768240/…

Lukas 09.08.2018 22:32

этот совет также помог мне с другой проблемой, связанной с несколькими вкладками AngularFirestoreModule.enablePersistence({experimentalTabSyn‌​chronization: true})

Junior Mayhé 03.03.2019 13:29

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