用于身份验证的 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 文档中概述了这些初始步骤。
我正在通过 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 文档中概述了这些初始步骤。