Firebase& Backbone:麻烦使用uid作为密钥

时间:2015-12-29 10:08:56

标签: javascript backbone.js firebase backbonefire

我使用Firebase和TodoMVC为每个用户创建了登录名和唯一的待办事项列表,作为另一个项目的概念证明。我正在使用Firebase和Google来记录用户,当事情正常时,他们会获得一个独特的持久性待办事项列表。

当用户已经通过浏览器登录Google时,一切正常(我认为)。

问题发生在他们不是的时候。他们看到未定义用户的待办事项列表,直到他们点击刷新,然后再次工作,而不是他们的待办事项列表或其用户ID下的空白列表。 Firebase网址在刷新之前看不到他们的uid。如果您已登录Google,则可以通过打开隐身窗口来复制错误。

您可以在我http://lacyjpr.github.io/todo-backbone的代码中查看错误,在https://github.com/lacyjpr/todo-backbone处找到我的回复

这是我的身份验证码:

 // Authenticate with Google
 var ref = new Firebase(<firebase url>);
  ref.onAuth(function(authData) {
    if (authData) {
      console.log("Authenticated successfully");
    } else {
      // Try to authenticate with Google via OAuth redirection
      ref.authWithOAuthRedirect("google", function(error, authData) {
        if (error) {
          console.log("Login Failed!", error);
        }
      });
    }
  })

// Create a callback which logs the current auth state
function authDataCallback(authData) {
  if (authData) {
    console.log("User " + authData.uid + " is logged in with " +               authData.provider);
  uid = authData.uid;
} else {
  console.log("User is logged out");
 }
}

这是获取用作firebase密钥的UID的代码:

// Get the uid of the user so we can save data on a per user basis
var ref = new Firebase(<firebase url>);
var authData = ref.getAuth();

if (authData) {
  var uid = authData.uid;
  console.log(uid);
}

// The collection of todos is backed by firebase instead of localstorage
var TodoList = Backbone.Firebase.Collection.extend({

// Reference to this collection's model.
model: app.Todo,

// Save all of the todos to firebase
url: <firebase url> + uid,

提前感谢您提出的任何建议!

1 个答案:

答案 0 :(得分:2)

在用户通过身份验证之前,您正在调用.getAuth()

您的应用程序严重依赖uid才能正常运行。因此,在您的情况下,您可能希望在用户成功通过身份验证后启动应用程序的Backbone部分。

您可以将app.js修改为仅在用户通过身份验证时启动。

// js/app.js

var app = app || {};
var ENTER_KEY = 13;

$(function() {

  var ref = new Firebase(<firebase url>);
  var authData = ref.getAuth();
  if (authData) {
    ref.authWithOAuthRedirect("google", function(error, authData) {
      if (error) {
        console.log("Login Failed!", error);
      } else {
        // kick off app
        new app.AppView();
      }
    });
  } else {
     new app.AppView();
  }

});

虽然这会有效,但它并不是理想的解决方案。但由于您没有登录屏幕,因此没有其他选择。

理想情况下,您希望为用户提供登录位置,然后您可以访问.getAuth()值。

另外,请不要担心将uid存储在window上。 .getAuth()是缓存用户,因此没有网络调用来获取数据。