2

我想在我的Angular 4應用程序中檢索當前登錄的Firebase用戶的UID。雖然,如果我將'firebase.auth()。currentUser'記錄到控制檯,我會得到'null'。因此,'firebase.auth()。currentUser.uid'給出了'無法讀取屬性'空'錯誤'。firebase.auth()。currentUser爲null

根據這篇文章https://firebase.google.com/docs/auth/web/manage-users這將意味着我目前還沒有登錄。雖然,我是,因爲我可以從我的數據庫中讀取數據(我的規則不允許未經身份驗證的用戶),並且登錄方法沒有給出了任何錯誤。

我還可以看出,隨着UID 1用戶在火力控制檯登錄(.../U/1 /項目/ 我的項目 /認證/用戶)

我的數據庫規則:

{ 
    "rules": { 
    "users": { 
     "$uid": { 
     ".write": "$uid === auth.uid", 
     ".read": "$uid === auth.uid" 
     } 
    } 
    } 
} 

注:我沒有使用任何的火力地堡的登錄方法。我使用我的php後端來驗證用戶併爲firebase生成自定義令牌,完全如此處所述:https://firebase.google.com/docs/auth/admin/create-custom-tokens

角4登錄代碼:

constructor(private afAuth: AngularFireAuth) { 
    this.login(); 
} 

login() { 
    console.log('We are logging in on Firebase :)'); 
    firebase.auth().signInWithCustomToken(localStorage.getItem('firebase_token')).catch(function (error) { 
     console.log(error.message); 
     console.log('You are not logged in!'); 
    }); 
    this.user = firebase.auth().currentUser; 
    console.log(firebase.auth().currentUser); 
    console.log(firebase.auth().currentUser.uid); 
} 

控制檯輸出:

chat.service.ts:59 We are logging in on Firebase :) 
chat.service.ts:65 null 
ChatComponent_Host.html:1 ERROR TypeError: Cannot read property 'uid' of null 
    at ChatService.Array.concat.ChatService.login (chat.service.ts:66) 
    at new ChatService (chat.service.ts:23) 
    at _createClass (core.es5.js:9572) 
    at _createProviderInstance$1 (core.es5.js:9544) 
    at resolveNgModuleDep (core.es5.js:9529) 
    at NgModuleRef_.get (core.es5.js:10615) 
    at resolveDep (core.es5.js:11118) 
    at createClass (core.es5.js:10971) 
    at createDirectiveInstance (core.es5.js:10802) 
    at createViewNodes (core.es5.js:12230) 
    at createRootView (core.es5.js:12125) 
    at callWithDebugContext (core.es5.js:13506) 
    at Object.debugCreateRootView [as createRootView] (core.es5.js:12823) 
    at ComponentFactory_.create (core.es5.js:9916) 
    at ComponentFactoryBoundToModule.create (core.es5.js:3333) 

回答

1

我想你應該修改代碼以下面,然後再試一次: -

constructor(private afAuth: AngularFireAuth) { 
    this.login(); 
} 

login() { 
    console.log('We are logging in on Firebase :)'); 
    firebase.auth().signInWithCustomToken(localStorage.getItem('firebase_token')) 
    .then(success=>{ 
    this.user = firebase.auth().currentUser; 
    console.log(firebase.auth().currentUser); 
    console.log(firebase.auth().currentUser.uid); 
    }) 
    .catch(function (error) { 
     console.log(error.message); 
     console.log('You are not logged in!'); 
    }); 

} 

通過使用then,您可以確保在訪問登錄的用戶對象之前簽入承諾已成功返回。

+0

謝謝!我對Angular 4比較陌生,並沒有真正想過這個。感謝您的快速和明確的答案! – Kevin

+0

沒問題!我很高興我能提供幫助。 –

1

當firebase尚未從本地加載數據時,您正在使用currentUser變量。因此,爲了知道currentUser變量何時啓動,您可以檢查onAuthStateChanged的回調。

var currentUser; 
firebase.auth().onAuthStateChanged(function(user){ 
     // user hols the reference to currentUser variable. 
}); 
相關問題