2

私はAngular 4アプリで現在ログインしているfirebaseユーザーのUIDを取得しようとしています。私が 'firebase.auth()。currentUser'をコンソールに記録している場合、私は 'null'を取得します。したがって、 'firebase.auth()。currentUser.uid'は、 'nullの' uid 'プロパティを読み取れません。'というエラーが返されます。firebase.auth()。currentUser is null

この記事ではhttps://firebase.google.com/docs/auth/web/manage-usersですが、現在ログインしていないことを意味します。データベースからデータを読み取ることができます(ルールでは認証されていないユーザーが許可されていません)。何か誤りがあった。

私はUID 1を持つユーザーがfirebaseコンソール(.../U/1 /プロジェクト/ 私のプロジェクト /認証/ユーザー)

私のデータベースルールにログインしていることもわかります:

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

注:私はFirebaseログイン方法のいずれかを使用していませんよ。私は私の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. 
});