2017-02-27 1 views
0

私のアプリにFacebookのログインを使用しています。私は正常にログインを完了することができますが、ページを更新するときsession.isAuthenticateは未定義になります。鳥居を使っているときに、Emberでリフレッシュした後にセッションサービスが定義されない理由

セッションを維持するロジックは、鳥居アダプターのフェッチ方法の中にとどまると思います。以下は私の鳥居アダプターです。何が足りないのか教えてください。以下は

import Ember from 'ember'; 
import {createToken} from 'myapp-new/utils/myapp-utils'; 
//import User from 'myapp-new/user/model'; 

export default Ember.Object.extend({ 
    store: Ember.inject.service(), 
    session: Ember.inject.service('session'), 
    fetch(){ 
    let token = session.token; 
    if(Ember.isEmpty(token)){ 
     throw new Error("No session found"); 
    } 
    else{ 
     return Ember.RSVP.resolve({token}); 
    } 
    }, 

    open: function(authentication){ 
    let authorizationCode = authentication.authorizationCode; 
    let token = createToken(); 
    let adapter = this; 
    return new Ember.RSVP.Promise(function(resolve, reject){ 
     console.log(authentication); 
     Ember.$.ajax({ 
     url: 'http://myapp.com/getUserInfoWuthAuthCode.php', 
     //url:'http://localhost:4200', 
     data: { 'code': authorizationCode,token:token}, 
     success: Ember.run.bind(null, resolve), 
     error: Ember.run.bind(null, reject) 
     }); 
    }).then(function(data){ 
     let user = data.user[0]; 

     return { 
     token:token, 
     user: user 
     }; 
    }); 
    } 
}); 

UPDATE 私はので、唯一のルート内のセッションをフック任意のコンポーネントを使用していないよ、私のルート

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    session: Ember.inject.service('session'), 
    actions:{ 
     signIn(){ 
      console.log("Working"); 
      this.get('session').open('google-oauth2').then(function(){ 
       console.log("Login Worked"); 
      }, function(error){ 
       console.log('error', 'Could not sign you in: '+error.message); 
      }); 
     } 
    }, 
    setupController(controller, model){ 
     controller.set('session', this.session); 
    } 
}); 

のコードです。注意する 一つのことは私の鳥居・アダプターの方法をフェッチでは、すべての時に呼び出さ取得されていません(それはリフレッシュに呼び出されなければなりません、そうではありませんか?)

答えて

0
let token = session.token; 

これは、常に未定義することになるだろう(sessionオブジェクトは未定義です)。正しい方法は、

let token = this.get('session.token') 
// OR 
this.get('session')['token'] 

私は、少なくとも私のために、よりエレガントに見える最初のオプションが好きです。

+0

問題はセッションコードではありません(とにかく、訂正してくれてありがとう)。しかし、私のコンポーネント(hbsファイル){{session.isAuthenticated}}はリフレッシュ後に定義されていません。 –

+0

少なくとも生成されたコントローラで 'controller'の中に' session'がありますか? –

+0

自分のルートにセッションを挿入しましたが、ログイン{{session.isAuthenticated}}がtrueに評価された直後に、リフレッシュ後にはセッションが挿入されませんでした。それについて気付くべきことは、アダプタのフェッチメソッドが全く呼び出されないということです。私は何かが紛失している可能性があります –

1

鳥居セッション変数は、このような設定ファイルに設定する必要があります。これは、他の人の間であなたのルートにサービス変数を挿入します

// config/environment.js 
var ENV = { 
    torii: { 
    sessionServiceName: 'session' 
} 

。また、これはあなたのルートのbeforeModelフックを使用しないようにするセッションが閉じられているアプリの各リフレッシュ、と、このような何か:

beforeModel: function() { 
    return this.get('session').fetch().catch(function() {}); 
}, 
+0

あなたのコードを使用して私は私のフェッチメソッドを呼び出すことができますが、自分のオープンメソッドで割り当てたセッションから自分のトークンを得ることができません。 {{session.token}}を使用してアプリケーションでトークンを取得できますが、{{session.isAuthenticated}}が定義されていないため、リフレッシュ後にはトークンを取得できません –

0

ファルケの答え@は参考になりましたが、私の問題を解決していませんでした。

r & dの後に、フェッチメソッドが呼び出されていないため、session.isAuthenticatedが未定義となっていました。 @falkeのおかげで、私はそれを実行することができました。

は、私は私のアダプターのopenメソッドのコードの下に使用する代わりに、セッションののlocalStorageで私のトークンを格納し

open: function(authentication){ 
    let authorizationCode = authentication.authorizationCode; 
    //let token = createToken(); 
    // let adapter = this; 
    return new Ember.RSVP.Promise(function(resolve, reject){ 
     console.log(authentication); 
     resolve({authorizationCode}); 
    }).then(function(data){  
     localStorage.setItem('token',authorizationCode); 
     return { 
     token:authorizationCode   
     }; 
    }); 
    } 

私は下に戻って私の方法をフェッチ使用してコードでそれを見つけることができた

fetch(){ 
    let token = localStorage.getItem('token'); 
    console.log(token); 
    if(Ember.isEmpty(token)){ 
     throw new Error("No session found"); 
    } 
    else{ 
     return Ember.RSVP.resolve({token}); 
    } 

これが助けてくれることを願っています

関連する問題