2017-10-05 9 views
0

私は以下のコードを使用しますが、動作しません。トークンが4で期限切れになったときにサイレントログインしますか?

私がホームページに入力したとき、ログは表示されません(コンソールログでは、最初に表示され、最後に表示され、最後は2番目です)ので、順番に実行されないため、常に無効なトークンを返します。私はどこが間違っているのか分かりません。 私を助けてください。皆さん、ありがとうございました !

logIn(identifi : string, password : string) { 
    let headers = new Headers(); 
    headers.append('Access-Control-Allow-Origin', '*'); 
    headers.append('Access-Control-Allow-Methods', '*'); 
    headers.append('Access-Control-Allow-Headers', 'Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With');  
    let body = { 
     "user_id" : identifi, 
     "password" : password 
    }; 
    let options = new RequestOptions({ headers: headers }); 
    return this.http.post(api.logIn, body, options).map((res:Response) => res.json()); 
    } 

    checkToken() { 
    this.storage.get('user').then((user) => { 
     if(user) { 
     this.token = user.token; 
     this.token_date = user.token_date - 100; 
     this.currentDate = new Date(); 
     this.expDate = new Date(this.token_date * 1000); 
     if (this.currentDate <= this.expDate) { 
      // token expired, login again  
      console.log('first'); 
      this.logIn(user.user_id, user.password).subscribe(
      data => { 
       this.storage.set("user", userInfo); 
       console.log('second'); 
       return userInfo.token; 
      }, 
      err => { 
       console.log(err); 
      }); 
     } 
     } 
    }) 
    } 

    getDataHomepage(retailerId: number,pageIndex: number) { 
    this.checkToken(); 
    console.log('last'); 
    let headers = new Headers(); 
    headers.append('Authorization', 'Bearer ' + this.token); 
    let options = new RequestOptions({ headers: headers }); 
    return this.http.get(api.promotion + '?retailer_id=' + retailerId + '&page=' + pageIndex, options).map((res:Response) => res.json()); 
    } 

答えて

0

あなたの問題は、あなたがgetDataHomepageでcheckToken()を呼び出し、それが終了するのを待っていると、データのホームページを取得呼び出すために前進していないということです。 (javascriptはcheckToken()が終了するのを待っていませんが、getDataHomepageでgetを呼び出します)

ログイン後、このアフターから「this.http.get」データを呼び出す必要があります。ログインの購読 または「flatMap」を使ってみては私にあなたのコードの継ぎ目にこの部分hier

二不審な場所を説明した:私は、代わりにあなたが<を使用する必要が===考える

 if (this.expDate === this.currentDate) { 
     // token expired, login again 

を=または> =しかし、あなたはそれをテストしなければなりません。

+0

ようflatMapとforkJoinを使用しています。 expDate)、関数getToken()はまだ最後に実行されます。私はトークンを得ることができません。何か案は ? –

+0

コメントコードスニペットで彼女を追加できないので、私の他の投稿を見てください。https://stackoverflow.com/a/46603857/3853300 – Sheki

0

クイックルックの後、あなたの日付に間違いがあります。 方が良い何ができるか、日付=日付がある場合は言う:

if(this.currentDate <= this.expDate){ 
//login } 
else{ 
//logout with expired message } 

またはその逆。

セッションは永久に存在するようにセッションの有効期限を切るために主に使用するセッションです。あなたがセッションを作る理由が期限切れにならない場合は?

0

私は2つのバグを持っていると言いましたが、今変更したのは2番目の問題の解決策(多分私には分かりません。テストする必要があります)です。最初の問題はcheckTokenを呼び出さなければならないということです。ログインおよびネストされた観測などgetDataHompageこのような何か:エレガントな解決のためだけのアイデアを持っている

 logIn(identifi : string, password : string) { 
     let headers = new Headers(); 
     headers.append('Access-Control-Allow-Origin', '*'); 
     headers.append('Access-Control-Allow-Methods', '*'); 
     headers.append('Access-Control-Allow-Headers', 'Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With');  
     let body = { 
     "user_id" : identifi, 
     "password" : password 
     }; 
     let options = new RequestOptions({ headers: headers }); 
     return this.http.post(api.logIn, body, options).map((res:Response) => res.json()); 
    } 

    checkToken() { 
     this.storage.get('user').then((user) => { 
     if(user) { 
      this.token = user.token; 
      this.token_date = user.token_date - 100; 
      this.currentDate = new Date(); 
      this.expDate = new Date(this.token_date * 1000); 
      if (this.currentDate <= this.expDate) { 
      // token expired, login again  
      console.log('first'); 
      return this.logIn(user.user_id, user.password).map((res:Response) => res.json()); 
       /* .subscribe(
        data => { 
        this.storage.set("user", userInfo); 
        console.log('second'); 
        return userInfo.token; 
        }, 
        err => { 
        console.log(err); 
        });*/ 
      }else{ 
      return Observable.of(user); 
      } 
     } 
     }) 
    } 

    getDataHomepage(retailerId: number,pageIndex: number) { 
     this.checkToken().subscribe((res)=>{ 
     console.log('last'); 
     let headers = new Headers(); 
     headers.append('Authorization', 'Bearer ' + this.token); 
     let options = new RequestOptions({ headers: headers }); 
     return this.http.get(api.promotion + '?retailer_id=' + retailerId + '&page=' + pageIndex, options).map((res:Response) => res.json()); 
     },(err)=>{}); 
    } 

は、(this.currentDate <=この場合、私はに変更した説明hier

関連する問題