Вызвана функция DocumentReference.set () с недопустимыми данными. Неподдерживаемое значение поля: функция (находится в диспетчере полей) " - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь создать веб-приложение с vue, vuex и пытаюсь интегрировать его с базой данных Firebase. Но эта ошибка появляется, когда я пытаюсь разместить данные в базе данных:

[Vue warn]: Error in v-on handler (Promise/async): "FirebaseError: [code=invalid-argument]:
Function DocumentReference.set() called with invalid data. Unsupported field value:
a function (found in field dispatch)" found in 
---> <Subreddit> at src/views/Subreddit.vue
   <App> at src/App.vue
     <Root>

Код скрипта внутри модуля "Subreddit. vue":

<script>
import { mapState, mapActions } from 'vuex';

export default {
  data: () => ({
    post: {
      title: '',
      description: '',
      URL: '',
    },
  }),
  computed: mapState('subreddit', ['posts']),
  methods: {
    ...mapActions('subreddit', ['createPost']),
    async onCreatePost() {
      if (this.post.title && (this.post.description || this.post.URL)) {
        await this.createPost(this.post);
      }
    },
  },
};
</script>

Это subreddit. js из каталога магазина, в который записан createPost (), внутри действий,

import db from '@/db';

const posts = db.collection('posts');

const state = {
  posts: [],
};

const actions = {
  async createPost(post) {
    console.log(post); // eslint-disable-line no-console
    const result = posts.doc();
    post.id = result.id; // eslint-disable-line no-param-reassign
    await posts.doc(post.id).set(post);
  },
};

export default {
  namespaced: true,
  state,
  actions,
};

Вывод для console.log(post) из createPost(post) слишком длинный, но это так:

{getters: {…}, state: {…}, rootGetters: {…}, dispatch: ƒ, commit: ƒ, …}
commit: ƒ (_type, _payload, _options)
dispatch: ƒ (_type, _payload, _options)
getters: {}
id: "VassMHMvvK2UlfS79bDp"
rootGetters: {}
rootState: {__ob__: Observer}
state: {__ob__: Observer}
__proto__: Object

В чем ошибка, я не могу ее отладить.

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Я решил проблему. По какой-то причине, даже если атрибуты в коллекции явно не определены как «обязательные», операция post не будет работать, пока весь объект не будет передан в базу данных firestore. Возможно, я ошибаюсь, но, попробовав все и потерпев неудачу и просто решив продолжить кодирование проекта, ошибка просто исчезла. Код доступен на моем GitHub , если вам нужно проверить его. Спасибо за вашу помощь.

0 голосов
/ 19 марта 2020

Первым параметром функции set() должна быть «карта полей и значений для документа», как объяснено в документации .

По вашему вопросу, это Похоже, что вы передаете объект, который не соблюдает это ограничение.

{getters: {…}, state: {…}, rootGetters: {…}, dispatch: ƒ, commit: ƒ, …}
commit: ƒ (_type, _payload, _options)
dispatch: ƒ (_type, _payload, _options)
getters: {}
id: "VassMHMvvK2UlfS79bDp"
rootGetters: {}
rootState: {__ob__: Observer}
state: {__ob__: Observer}
__proto__: Object

Это именно то, что указывает сообщение об ошибке: DocumentReference.set() called with invalid data.

Таким образом, вы должны адаптировать свой объект таким образом это карта полей и значений для документа.

Например:

const obj = {foo: 'bar', bar: 'foo'};
await posts.doc(post.id).set(obj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...