angular - setTimeout によって呼び出されたときのセッション タイムアウト ログアウト :: RouterExtensions エラー

okwaves2024-01-25  9

一定期間アイドル状態のときにセッション タイムアウトを実装しようとしています。

ユーザーがログインすると、一定時間後にユーザーをログアウトさせ、ログイン フォームに戻すタイマーを開始します。

イベントがある場合 (タップ)、タイマー (ここでは 5 秒) をクリアし、新しいタイマーを開始して、ユーザーのログイン状態を維持します。

login.component.ts の setTimout 呼び出しは次のとおりです。

var timeoutId=setTimeout(this.funcService.logout, 5000);
ApplicationSettings.setNumber("timeoutId", timeoutId);

ログアウト機能を持つ func.service.ts は次のとおりです。

import {Injectable} from '@angular/core';
import {RouterExtensions} from "nativescript-angular/router";
import * as ApplicationSettings from "@nativescript/core/application-settings";

@Injectable({   providedIn: 'root' })
export class FuncService {
    
  constructor(
    private routerExtensions: RouterExtensions
  ) {
  }

  logout(): void {

    ApplicationSettings.setBoolean("authenticated", false);
    ApplicationSettings.remove("token");

    this.routerExtensions.navigate(["./login"], {clearHistory: true});
  }  
}

app.component.html

<page-router-outlet actionBarVisibility="never" (tap)=onEvent()></page-router-outlet>

app.component.ts

 onEvent() {
    var timeoutId=ApplicationSettings.getNumber("timeoutId");

    ApplicationSettings.remove("timeoutId");

    clearTimeout(timeoutId);

    var timeoutId=setTimeout(this.funcService.logout, 5000);
    ApplicationSettings.setNumber("timeoutId", timeoutId);
  }

タイマーが切れて this.funcService.logout が呼び出されると、次のエラーが発生します。

JS: ### ErrorHandler Error: TypeError: Cannot read property 'routerExtensions' of undefined
JS: ### ErrorHandler Stack: TypeError: Cannot read property 'routerExtensions' of undefined
JS:     at webpackHotUpdate../shared/func.service.ts.FuncService.logout (file:///app\shared\func.service.ts:35:9)
JS:     at ZoneDelegate.push.../node_modules/@nativescript/angular/zone-js/dist/zone-nativescript.js.ZoneDelegate.invokeTask (file:///node_modules\@nativescript\angular\zone-js\dist\zone-nativescript.js:421:0)
JS:     at Object.onInvokeTask (file:///node_modules\@angular\core\fesm5\core.js:24328:0)
JS:     at ZoneDelegate.push.../node_modules/@nativescript/angular/zone-js/dist/zone-nativescript.js.ZoneDelegate.invokeTask (file:///node_modules\@nativescript\angular\zone-js\dist\zone-nativescript.js:420:0)
JS:     at Zone.push.../node_modules/@nativescript/angular/zone-js/dist/zone-nativescript.js.Zone.runTask (file:///node_modules\@nativescript\angular\zone-js\dist\zone-nativescript.js:188:0)
JS:     at push.../node_modules/@nativescript/angular/zone-js/dist/zone-nativescript.js.ZoneTask.invokeTask (file:///data/...

this.funcService.logout を明示的に呼び出しても、エラーは発生しません。

ここで何が起こっているのか、回避できる方法はありますか?

これを実装する方法は問題ありませんか?

TIA

注: ルーターも使用してみました

this.router.navigate(["./login"], {
  relativeTo: this.activatedRoute
});

取得

S: ### ErrorHandler Error: TypeError: Cannot read property 'router' of undefined
JS: ### ErrorHandler Stack: TypeError: Cannot read property 'router' of undefined
JS:     at module.exports.push../shared/func.service.ts.FuncService.logout (file:///app\shared\func.service.ts:38:9)
JS:     at ZoneDelegate.push.../node_modules/@nativescript/angular/zone-js/dist/zone-nativescript.js.ZoneDelegate.invokeTask (file:///node_modules\@nativescript\angular\zone-js\dist\zone-nativescript.js:421:0)
JS:     at Object.onInvokeTask (file:///node_modules\@angular\core\fesm5\core.js:24328:0)
JS:     at ZoneDelegate.push.../node_modules/@nativescript/angular/zone-js/dist/zone-nativescript.js.ZoneDelegate.invokeTask (file:///node_modules\@nativescript\angular\zone-js\dist\zone-nativescript.js:420:0)
JS:     at Zone.push.../node_modules/@nativescript/angular/zone-js/dist/zone-nativescript.js.Zone.runTask (file:///node_modules\@nativescript\angular\zone-js\dist\zone-nativescript.js:188:0)
JS:     at push.../node_modules/@nativescript/angular/zone-js/dist/zone-nativescript.js.ZoneTask.invokeTask (file:///data/data/com.FileExpenses.app/files/app/v...

更新

これはうまくいきました

var timeoutId=setTimeout(() => {

  ApplicationSettings.setBoolean("authenticated", false);
  ApplicationSettings.remove("token");

  this.routerExtensions.navigate(["./login"], {clearHistory: true});
}, 5000);

ありがとう @Yong



------------------------

未定義の routerExtensions を修正するには

var timeoutId=setTimeout(() => this.funcService.logout, 5000);

1

ありがとう@Yong これを試してみましたが、タイムアウト時に関数が呼び出されません。ただし、lを入れるとogout コードを setTimeout に追加すると、投稿の最後に追加したように機能します。 this.funcService.logout への関数呼び出しが起動しない理由がわかりません。

– チャコサ

2020 年 9 月 4 日 9:29

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。