# #javascript #firebase #vue.js #google-cloud-firestore #vuejs2
Вопрос:
Я пытаюсь разработать календарь, который будет содержать задачи. Я пытаюсь использовать firebase, но он продолжает выдавать ошибку, в которой говорится, что он не понимает свойство » коллекция ()». Я уже исследовал много вещей, пытался сделать это другими способами, но ничего не получил. Я могу зарегистрироваться, если поступлю иначе, но считывать данные с помощью «коллекции» — нет. Подробно я использую версию 9 firebase
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'collection')
Я не знаю, что еще делать, может кто-нибудь мне помочь, пожалуйста? Весь сценарий приведен ниже.
Скрипт
export default {
data: () => ({
today: new Date().toISOString().substr(0, 10),
focus: new Date().toISOString().substr(0, 10),
type: 'month',
typeToLabel: {
month: 'Month',
week: 'Week',
day: 'Day',
'4day': '4 Days',
},
name: null,
details: null,
start: null,
end: null,
color: '#1976D2', // default event color
currentlyEditing: null,
selectedEvent: {},
selectedElement: null,
selectedOpen: false,
events: [],
dialog: false
}),
mounted () {
this.getEvents()
},
computed: {
title () {
const { start, end } = this
if (!start || !end) {
return ''
}
const startMonth = this.monthFormatter(start)
const endMonth = this.monthFormatter(end)
const suffixMonth = startMonth === endMonth ? '' : endMonth
const startYear = start.year
const endYear = end.year
const suffixYear = startYear === endYear ? '' : endYear
const startDay = start.day this.nth(start.day)
const endDay = end.day this.nth(end.day)
switch (this.type) {
case 'month':
return `${startMonth} ${startYear}`
case 'week':
case '4day':
return `${startMonth} ${startDay} ${startYear} - ${suffixMonth} ${endDay} ${suffixYear}`
case 'day':
return `${startMonth} ${startDay} ${startYear}`
}
return ''
},
monthFormatter () {
return this.$refs.calendar.getFormatter({
timeZone: 'UTC', month: 'long',
})
}
},
methods: {
async getEvents () {
let snapshot = await dbStore.collection('calEvent').get()
const events = []
snapshot.forEach(doc => {
let appData = doc.data()
appData.id = doc.id
events.push(appData)
})
this.events = events
},
setDialogDate( { date }) {
this.dialogDate = true
this.focus = date
},
viewDay ({ date }) {
this.focus = date
this.type = 'day'
},
getEventColor (event) {
return event.color
},
setToday () {
this.focus = this.today
},
prev () {
this.$refs.calendar.prev()
},
next () {
this.$refs.calendar.next()
},
async addEvent () {
if (this.name amp;amp; this.start amp;amp; this.end) {
await dbStore.collection('calEvent').add({
name: this.name,
details: this.details,
start: this.start,
end: this.end,
color: this.color
})
this.getEvents()
this.name = '',
this.details = '',
this.start = '',
this.end = '',
this.color = ''
} else {
alert('You must enter event name, start, and end time')
}
},
editEvent (ev) {
this.currentlyEditing = ev.id
},
async updateEvent (ev) {
await dbStore.collection('calEvent').doc(this.currentlyEditing).update({
details: ev.details
})
this.selectedOpen = false
this.currentlyEditing = null
this.getEvents()
},
async deleteEvent (ev) {
await dbStore.collection('calEvent').doc(ev).delete()
this.selectedOpen = false
this.getEvents()
},
showEvent ({ nativeEvent, event }) {
const open = () => {
this.selectedEvent = event
this.selectedElement = nativeEvent.target
setTimeout(() => this.selectedOpen = true, 10)
}
if (this.selectedOpen) {
this.selectedOpen = false
setTimeout(open, 10)
} else {
open()
}
nativeEvent.stopPropagation()
},
updateRange ({ start, end }) {
this.start = start
this.end = end
},
nth (d) {
return d > 3 amp;amp; d < 21
? 'th'
: ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'][d % 10]
}
}
}
Главная
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import vuetify from './plugins/vuetify'
// Firebase
import firebase from 'firebase/compat/app';
import 'firebase/compat/firestore';
//I have initialized my project with valid values but commented the keys to avoid publishing them online.
firebase.initializeApp({
apiKey: "<my_api_key>",
authDomain: "<my_project_domain>",
projectId: "<my_project_id>",
databaseURL: "",
storageBucket: "<my_project_storage_bucket>",
messagingSenderId: "<my_messaging_sender_id>",
appId: "<my_app_id>",
measurementId: "<my_measurement_id>"
});
Vue.config.productionTip = false
new Vue({
router,
vuetify,
render: h => h(App)
}).$mount('#app')
export const dbStore = firebase.firestore();
Комментарии:
1. Я не вижу, чтобы вы импортировали
dbStore
в свой файл сценария. Можете ли вы поделиться инструкциями по импорту?2. При вызове
this.getEvents()
не гарантируется, чтоdbStore
это гидратированный объект с ожидаемыми методами.
Ответ №1:
- Проверьте, импортируете ли вы DbStore
- Воспользуйся
this.dbStore.collection('calEvent').get().then((res)=>{ const events = res.docs; })
Ответ №2:
Возможно, вы неправильно привязываете свои данные, поэтому вам необходимо устранить неполадки, независимо от того, связана ли проблема с внутренним или внешним интерфейсом. Похоже, что вы, возможно, неправильно получаете данные, прежде чем создавать структуру веб-сайта, вам нужно правильно получить все данные и базу данных, а затем вы можете начать создание и привязку ее к интерфейсу.
Я бы сначала попробовал с фиктивными данными, например, вернуть json и проверить, получает ли его приложение или если сетевой запрос получает ответ, если ответов 200, затем проверьте, как поступает в приложение с помощью
<pre>{{ yourObject }}</pre>
Если он не пустой, попробуйте использовать реальные данные. Если он также не пуст, ваши данные правильно привязаны.
Вы также можете жестко закодировать некоторые данные в своем сценарии, чтобы узнать, не исходит ли проблема из внешнего интерфейса, например, так:
data: () => ({
today: 14/02/2021
focus: 14/01/2021
type: 'month',
}),
Также вы можете попробовать использовать Vuefire для привязки ваших данных, это поможет вам лучше интегрировать Firebase в VueJS. Вы можете следовать этому действительно полезному руководству о том, как привязать ваши данные из firestore с помощью Vuefire.
Для начала просто включите библиотеки Vue, Firebase и VueFire на своей странице:
<head>
<!-- Vue -->
<script src="https://cdn.jsdelivr.net/vue/latest/vue.js"></script>
<!-- Firebase -->
<script src="https://cdn.firebase.com/js/client/2.4.2/firebase.js"></script>
<!-- VueFire -->
<script src="https://cdn.jsdelivr.net/vuefire/1.0.0/vuefire.min.js"></script>
</head>
VueFire автоматически обнаружит присутствие Vue и установится сам. Если вы используете пакет модулей, вы также можете установить зависимости с помощью NPM:
npm install vue firebase vuefire --save
var Vue = require("vue");
var VueFire = require("vuefire");
var Firebase = require("firebase");
// explicit installation is required in a module environment
Vue.use(VueFire);