我正在尝试使用 Firebase 和 Twitter 设置用户身份验证。此答案中的代码在一定程度上有效:
var url = 'https://molovo-comments.firebaseio.com/';
var myDataRef = new Firebase(url);
var dataStore = (function(){
var user = null;
var auth = new FirebaseSimpleLogin(myDataRef, function(error, data) {
if (error) {
// an error occurred while attempting login
console.log(error);
} else if (user) {
// user authenticated with Firebase
user = data;
console.log('User ID: ' + user.id + ', Provider: ' + user.provider);
} else {
// user is logged out
}
});
return {
getAuth : function() {
if (auth) return auth;
// else show some error that it isn't loaded yet;
},
getUser : function() {
if (user) return user;
// else show some error that it isn't loaded yet;
}
};
})();
我可以使用 auth 变量访问dataStore.getAuth()
并且 user.id 被记录到控制台。调用dataStore.getAuth().login('twitter')
也可以,我被重定向到 twitter 登录页面。
但是,如果我尝试使用外部返回用户 ID,则会dataStore.getUser().id
出现cannot read property 'id' of undefined
错误。
我想我可能只是user
以错误的方式返回,所以如果有人能对这个问题有所了解,我将非常感激。
更新: 感谢@BenjaminWarren 和@SpinyNorman 的回答,我更新了代码以使用正确的变量,如下所示:
var dataStore = (function(){
var userObj = null;
var auth = new FirebaseSimpleLogin(myDataRef, function(error, user) {
if (error) {
// an error occurred while attempting login
console.log(error);
} else if (user) {
// user authenticated with Firebase
userObj = user;
console.log('User ID: ' + userObj.id + ', Provider: ' + userObj.provider);
} else {
// user is logged out
}
});
return {
getUser : function() {
if (userObj) return userObj;
// else show some error that it isn't loaded yet;
},
getAuth : function() {
if (auth) return auth;
// else show some error that it isn't loaded yet;
}
}
})();
jQuery(document).ready(function($) {
console.log(dataStore.getUser().id);
});
控制台输出如下所示:
Uncaught TypeError: Cannot read property 'id' of undefined main.js:37
User ID: 222936694, Provider: twitter main.js:14
所以dataStore.getUser().id
在 auth 对象被返回之前被记录,因此是未定义的。我在 getUser() 返回时尝试了不同的 setTimout 值等,但它总是在返回之前返回auth
干杯,
詹姆士