Ошибка пакетной записи в Firebase Cloud Firestore из-за неправильного типа

#javascript #firebase #vue.js #google-cloud-firestore

# #javascript #firebase #vue.js #google-cloud-firestore

Вопрос:

Я пытаюсь выполнить пакетную запись в свою базу данных. Однако, похоже, проблема в data[] том, что я получаю эту ошибку:

 FirebaseError: Expected type 't', but it was: a custom e object
 

Код:

 <template>
  <div>
    <v-btn @click="setData()">
      Write to Firestore
    </v-btn>
    <router-view/>
  </div>
</template>

<script>
 import { db } from '@/firebase'

export default {
  methods: {
    setData() {
      
    var data = 
      [
        { 
          'title':'Ipsum lorem',
          'description':'Some text...',
          'color':'#03A9F4',
          'meta': 
            { 
              'docID':'',
              'createdBy':'', 
            }
        },
        { 
          'title':'Loren ipsum',
          'description':'Some more text...',
          'color':'#06A1F3',
          'meta': 
            { 
              'docID':'',
              'createdBy':'', 
            }
        }
      ]

      var batch = db.batch()
      data.forEach((doc) => {
        var dbRef = db.collection('teams').doc('team01').collection('templates')
        batch.set(dbRef, doc)
      })
      batch.commit().then(function() {
        return console.log("done")
      });
    }
  }
}
</script>
 

В моем файле data[] содержится больше объектов, чем показано здесь. Они ниже предела 500. Это делается в моем Vue.js приложение, использующее Vuetify.

  1. Как я могу решить эту проблему?
  2. Как я могу добавить идентификатор / ссылку каждого созданного документа и вставить его meta.docID ? я не могу заставить это работать с пакетной записью.

Любая помощь приветствуется, спасибо!

Ответ №1:

Ваш dbRef объект CollectionReference:

 var dbRef = db.collection('teams').doc('team01').collection('templates')
 

Недопустимо передавать ссылку CollectionReference в set() :

 batch.set(dbRef, doc)   // this isn't valid
 

Как вы можете видеть из документации API, вместо этого set() требует DocumentReference в качестве первого аргумента, поэтому вам нужно будет определить документ для записи, чтобы вызвать его. Это означает, что вам нужно будет определить уникальный идентификатор документа для записи здесь. Например:

 var dbRef = db
    .collection('teams')
    .doc('team01')
    .collection('templates')
    .doc("what-is-your-document-id?")
 

Если вам нужен случайный идентификатор документа, вы можете просто не указывать аргументы в вызове doc() :

 var dbRef = db
    .collection('teams')
    .doc('team01')
    .collection('templates')
    .doc()