Ошибка типа Polymerfire

Я новичок в Polymer и пытаюсь сохранить пользовательские данные с помощью компонента Firebase-document.

Вот соответствующие фрагменты кода:

Инициализация компонента:

    <firebase-document id="document" app-name="nameoftheapp"
                       path="[[userDataPath]]" data="{{userData}}">
    </firebase-document>

И часть javascript:

    Polymer({
        is: 'registration-view',

        properties: {
            userData: Object,
            userDataPath: {
                type: String,
                notify: true
            }
        },

        debugFunction: function () {
            user = this.domHost.user;
            this.userDataPath = '/users/' + user.uid;
            this.userData.firstName = "fname";
            this.userData.lastName = "lname";
            console.log(user);
            console.log(this.userDataPath);
            this.$.document.save(this.userDataPath).then(function () {
                console.log("success");
            });
        }, 
        ......

Когда я вызываю функцию отладки, я получаю

Неперехваченный (в промисе) TypeError: c[b] не является функцией(…).

Трассировки стека:

1) debugFunction @ registration-view.html:106
2) save @ firebase-document.html:82
3) (anonymous function) @ firebase-document.html:93
4) c @ firebase-app.js:formatted:939

Ошибка возникает в свернутом файле firebase-app.js, поэтому я не очень умен. Надеюсь, все настроено правильно. Аутентификация пользователя работает хорошо, имя приложения также в порядке (если бы это было не так, приложение не инициализировало бы ошибку).

Я пытался издеваться над данными в базе данных, и документ firebase их не загружает. Я установил правила базы данных так, чтобы данные были общедоступными, чтобы устранить потенциальные проблемы с авторизацией, но это не помогло.

{
  "rules": {
//     ".read": "auth != null",
    ".read": true,
//     ".write": "auth != null"
    ".write": true
  }
}

Попытка 2:

Я нашел другой способ сохранения данных, и вот код:

<firebase-document id="document" app-name="doctor-appointment-system" log>
</firebase-document>

Javascript-часть:

    debugFunction: function () {
        this.$.document.path = null;
        this.$.document.data = {
            'firstName': this.$.fninput.value,
            'lastName': this.$.lninput.value
        };
        console.log('users/' +  this.domHost.user.uid);
        this.$.document.save('users',  this.domHost.user.uid);
    },

С этой настройкой я получаю другую ошибку. Вот вывод из консоли:

пользователи/Z5uAEYO2S1g2JYClpkk1Vtw130i2

app-storage-behavior.html:350 Установка значения Firebase в users/Z5uAEYO2S1g2JYClpkk1Vtw130i2 для объекта {firstName: , lastName: }

firebase-database-behavior.html: 61 Uncaught (в обещании) TypeError: невозможно прочитать свойство 'ref' из undefined (…) _setFirebaseValue

Ошибка в следующей строке файла firebase-database-behaviour.html:

результат var = this.db.ref(path).set(leaf ? value.$val : value);

похоже, что есть какая-то проблема с конфигурацией, но аутентификация работает нормально, поэтому я ничего не знаю.

Я застрял на этом, поэтому любая помощь будет оценена.

Спасибо, Ян


person Jan Beneš    schedule 13.11.2016    source источник
comment
я думаю .save(this.userDataPath) вот в чем проблема, вы не можете обновить данные в user/uid до нового местоположения user/uid/randomkey   -  person linto cheeran    schedule 13.11.2016
comment
Спасибо за подсказку. Вы правы, что есть проблема с путем. Однако, если я создаю данные (база данных в настоящее время пуста), у меня еще нет случайного ключа, и я не знаю, как его решить. Я думаю, что firebase должна генерировать ключ самостоятельно. Итак, как мне сказать ему сделать это? Большое спасибо   -  person Jan Beneš    schedule 13.11.2016
comment
github.com/firebase/polymerfire/blob/master/ посмотри здесь save() автоматически создаст случайный ключ для тебя   -  person linto cheeran    schedule 13.11.2016
comment
приведенный выше код работает нормально без этого this.$.document.save(this.userDataPath).then(function () { console.log("success"); }); я думаю, что вы пытаетесь переместить родительскую папку в ее собственный дочерний элемент   -  person linto cheeran    schedule 13.11.2016
comment
Привет, спасибо за ответ. Однако, если удалить строку, это ничего не делает. Я попробовал другой подход, как описано выше, но без прогресса.   -  person Jan Beneš    schedule 14.11.2016


Ответы (1)


Я нашел решение, но я все еще не уверен, в чем была суть проблемы. Структура моего приложения - это одностраничное приложение. У меня есть элемент core-scaffold, который состоит из панели инструментов, app-route, iron-pages и элемента firebase-auth. Вышеприведенный код был расположен в регистрационном представлении, которое лениво загружается железными страницами при совпадении соответствующего URL-адреса. Я попытался переместить код прямо в файл core-scaffold, и все заработало нормально. И что удивительно, когда я вызвал код в режиме регистрации, он также сработал. Оказалось, что если я импортирую firebase-document.html в core-scaffold.html, ошибка не будет выдана детям.

Если кто объяснит в чем причина буду благодарен.

Спасибо, Ян

person Jan Beneš    schedule 14.11.2016
comment
Это звучит как хороший вопрос для #AskFirebase и/или #AskPolymer! - person jkhoffman; 19.02.2017