用于身份验证的 FirebaseSerializer 弄乱了我的模型

FirebaseSerializer for authentication messing with my models

我正在通过 Ember CLI + Emberfire + Firebase 实施 Facebook 身份验证。

我的 FirebaseSerializer 现在正在搞乱整个应用程序。

这是我得到的错误:

Error while processing route: lists.index

Assertion Failed: A (subclass of DS.Model) record was pushed into the store with the value of todos being '{-JnTd8HfiWnSCMri7zHV: true}', but todos is a hasMany relationship so the value must be an array. You should probably check your data payload or serializer. Error: Assertion Failed: A (subclass of DS.Model) record was pushed into the store with the value of todos being '{-JnTd8HfiWnSCMri7zHV: true}', but todos is a hasMany relationship so the value must be an array. You should probably check your data payload or serializer.

如果我点击调试 link,我看到:

Ember['default'].Logger.error.apply(this, errorArgs);

这是我保存在 nutella/serializers/app.js 下的序列化程序:

import DS from 'ember-data';
import Firebase from 'firebase';
import FirebaseAdapter from 'emberfire/adapters/firebase';

export default DS.FirebaseSerializer.extend();

这是我为 OAuth 添加的部分代码,可能会导致问题:

import Ember from 'ember';

var session = Ember.Object.extend({
    ref : new Firebase("https://nutella.firebaseio.com"),

    addFirebaseCallback: function() {
        var session = this;

        this.get("ref").onAuth(function(authData) {
            if (authData) {
                session.set("isAuthenticated", true);
            } else {
                session.set("isAuthenticated", false);
            }
        });
    }.on("init"),

    login: function() {
        return new Promise(function(resolve, reject) {
            this.get("ref").authWithOAuthPopup("facebook", function(error, user) {
                if (user) {
                    resolve(user);
                } else {
                    reject(error);
                }
            });
        });
    },

    currentUser: function() {
        return this.get("ref").getAuth();
    }.property("isAuthenticated")
});


export default {
    name: "Session",

    initialize: function (container, app) {
        app.register("session:main", session);
        app.inject("controller", "session", "session:main");
        app.inject("route", "session", "session:main");
    }
};

非常感谢您的帮助!

要设置应用程序序列化程序,您应该在 app/serializers/application.js(而不是 app.js)处创建一个文件。您的应用实际上正在回退到默认的 Ember 数据序列化程序。

以下是将 FirebaseSerializer 设置为应用默认值的正确代码:

// app/serializers/application.js
import FirebaseSerializer from 'emberfire/serializers/firebase';

export default FirebaseSerializer.extend();

然而,这可能不是必需的。

要让 emberfire 正常工作,您需要使用 Firebase 适配器。当您激活此适配器时,它会自动 将 Firebase 序列化程序注册为应用程序默认值(您可以完全删除 app/serializers/application.js)。

您要在 app/adapters/application.js 中声明 firebase 适配器吗?如果没有,最快的方法是再次 运行 余烬生成器:

ember generate emberfire

这将创建您的 app/adapters/application.js:

import config from '../config/environment';
import Firebase from 'firebase';
import FirebaseAdapter from 'emberfire/adapters/firebase';

export default FirebaseAdapter.extend({
  firebase: new Firebase(config.firebase)
});

它将在 config/environment.js 中放置一个示例 firebase URL。将此更新为您的真实 URL.

emberfire quickstart 文档中概述了这些初始步骤。