这是我第一次同时使用Vuetify和Firebase.

在一个教程之后,我试图在firebase中将一些数据添加到我的数据库中(而不是图像).

在使用npm在我的项目中安装firebase之后,我在一个单独的js文件中设置了它,如下所示:

import { initializeApp } from "firebase/app";
import { getFirestore, collection, getDocs } from 'firebase/firestore/lite';
import { getAnalytics } from "firebase/analytics";

const firebaseConfig = {
  apiKey: "....",
  ...
  ...
};


const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);
const db = getFirestore(app);

在vue中.js文件,其中有我想要添加的数据的新对象的表单,我try 这样做:

模板:

<template>
    <v-dialog max-width="600px">
        <v-btn flat slot="activator" class="success">
            Add new project
        </v-btn>
        <v-card>
            <v-card-title>
                <h1 class="display-1">Add a new project</h1>
            </v-card-title>
                <v-form class="px-3" ref="newProjectForm">
                    <v-card-text>
                        <v-text-field label="Title" v-model="title" prepend-icon="folder" :rules="inputRules"></v-text-field>
                        <v-textarea  :rules="inputRules" label="Information" v-model="content" prepend-icon="edit"></v-textarea>

                    <v-menu>
                        <v-text-field :rules="inputRules" slot="activator" :value="formattedDate" label="Due date" prepend-icon="date_range"></v-text-field>
                        <v-date-picker v-model="due"></v-date-picker>
                    </v-menu>

                    <v-spacer></v-spacer>
                    
                    <v-btn flat class="success mx-0 mt-3" @click="submit">Add project</v-btn>
                    </v-card-text>
                </v-form>
        </v-card>
    </v-dialog>
</template>

脚本:

import format from 'date-fns/format'

import parseISO from 'date-fns/parseISO'

import db from '@/fb'

export default {
    data(){
        return{
            title : "",
            content : "",
            due : null,
            inputRules: [
                v => v.length >= 4 || "Minimum length is 3 characters ",
            ]
        }
    },
    methods:{
        submit(){
            if(this.$refs.newProjectForm.validate()){
                // console.log(this.title,this.content,this.due);
                const project = {
                    title: this.title,
                    content: this.content,
                    due: format(parseISO(this.due), 'eee do MMMM y'),
                    person :'myself',
                    status: 'ongoing'
                }

                db.collection('Listify').add(project).then(() => console.log('added to db'))
            }
        }
    },
 computed: {
    formattedDate () {
      console.log(this.due)
      return this.due ? format(parseISO(this.due), 'eee do MMMM y') : ''
    }
  }}
</script>

记录的错误是"TypeError:无法读取未定义的属性(读取"集合")

我知道我可能是以错误的方式导入了一些东西,但我对这个非常陌生,我还没有很好地掌握它.

我想将表单中的对象上传到Firebase db,你能解释一下如何使用fire base,以及我缺少了什么吗?

另外,我的npm版本是8.3.1(我无法在atm上更新),这是个问题吗?

更新:

Frank van Puffelen提供的解决方案有效,但只要firebase设置在一个外部js文件中,只要我粘贴了调用submit方法的文件中的所有内容,我仍然无法让它工作,它工作了!

谢谢大家

推荐答案

您正在像这样导入Firestore:

import { getFirestore, collection, getDocs } from 'firebase/firestore/lite';

这是SDK的"新"v9版本的语法,它使用模块化语法.但你想打电话:

db.collection('Listify').add(project).then(() => console.log('added to db'))

这是旧SDK的命名空间语法.你不能这样混搭语法.

在模块化语法中,等效的调用是:

addDoc(collection(db, 'Listify'), project).then(...)

另见:

Javascript相关问答推荐

*ngFor和@代表输入decorator 和选角闭合

React:未调用useState变量在调试器的事件处理程序中不可用

使用TMS Web Core中的HTML模板中的参数调用过程

Angular 17—每当一个布尔变量变为真时触发循环轮询,只要它保持为真

将旋转的矩形zoom 到覆盖它所需的最小尺寸&S容器

Chart.js-显示值应该在其中的引用区域

为什么123[';toString';].long返回1?

映射类型定义,其中值对应于键

当我在Reaction中创建一个输入列表时,我的输入行为异常

如何在 Select 文本时停止Click事件?

如何在Bootstrap中减少网格系统中单个div的宽度

react -原生向量-图标笔划宽度

如何在AG-Grid文本字段中创建占位符

我不知道如何纠正这一点.

在高位图中显示每个y轴系列的多个值

如何在Firebase中读取对象的特定字段?

当S点击按钮时,我如何才能改变它的样式?

如何用react组件替换dom元素?

如何从Reaction-Redux中来自API调用的数据中筛选值

使用Java脚本筛选数组中最接近值最小的所有项