2016-08-07 1 views
1

何らかの理由でauthenticationProviderが欠落しているようです。なぜこれは機能ではない

@autoinject() 
export class ProviderManager implements AuthenticationManager { 
    constructor(private container: Container){ 
    } 
    public authenticate(creds: Credentials): Promise<Authentication> { 
     var provider = creds.authenticationProvider(); 
     return this.container.get(provider).authenticate(creds); 
    } 

} 

Credentials

export interface Credentials { 
    authenticationProvider(): { new(): AuthenticationManager }; 
} 

実装UsernamePasswordCredentials

export class UsernamePasswordCredentials implements Credentials { 

    public authenticationProvider(): {new(): AuthenticationManager} { 
     return HttpBasicAuthentication; 
    } 

    user: String; 
    pass: String; 
} 

AuthenticationManager

export interface AuthenticationManager { 
    authenticate(creds: Credentials): Promise<Authentication>; 
} 

Login

@autoinject() 
export class Login { 
    private log: Logger = LogManager.getLogger(Login); 
    creds: UsernamePasswordCredentials; 

    constructor(private am: AuthenticationManager, private router: Router) { 
    } 

    public signIn(): void { 
     this.log.debug(`authenticating ${ this.creds.user }`); 
     this.am.authenticate(this.creds).then(auth => { 
      var route = Route.MANAGE_CONTENT; 
      this.log.debug(`navigating to ${ route }`); 
      var router = this.router; 
      router.navigate(route); 
     }).catch(error => { 
      this.log.error(error); 
     }); 
    } 
} 

ここでChromeのスタックトレースはLoginコードを共有するための

VM802:1 Uncaught TypeError: creds.authenticationProvider is not a function(…)(anonymous function) @ VM802:1 
authenticate @ ProviderManager.ts:13 
signIn @ login.ts:22evaluate @ aurelia-binding.js:1522 
callSource @ aurelia-binding.js:4963 
(anonymous function) @ aurelia-binding.js:4987 
handleDelegatedEvent @ aurelia-binding.js:3176 
+0

signInメソッド(login.ts:22)では、あなたは 'providerManager.authenticate'メソッドに何を渡しますか?実行時にUsernamePasswordCredentialsのインスタンスが正しく初期化されていない可能性がありますか? –

+0

@DavidEは 'Login' TSを追加しましたが、どういうわけか基本的に正しいのです...何が起こっているのか十分にわからないのですが、参照はnullではなく、バインディングも機能します。 'creds:UsernamePasswordCredentials = new UsernamePasswordCredentials;'が動作するようにします – xenoterracide

答えて

1

おかげです。

あなたは正しい行にいますが、this.credsは以前は定義されていなかったようです。

コード

class Login { 
    creds: UsernamePasswordCredentials; 
} 

ちょうどそれがcredsをタイプUsernamePasswordCredentialsであることを期待している活字体を伝えます。しかし、それは信用フィールドを初期化するために何もしません...特に、上記のようになったときには、JavaScriptコードは出力されません(https://www.typescriptlang.org/play/は、transpilerが何をするのに役立つか)。

つまり、signInメソッドでは、this.credsは未定義です。

これは、C#では、フィールドを初期化しないと、デフォルトでnullになります。

Typescriptは多くのものをキャッチすることができますが、C#のような静的型付けされた言語が引き続きコンパイルされたコードを生成するのと同じように、変数が実行時に未定義/ null参照例外。

EDIT:ああ、私の申し立て。 credsが定義されていなかった場合は、ReferenceError: creds is not definedが届きました。 TypeErrorは、別の場所に入力されていたが間違ったタイプのものであることを明確にしておく必要があります。creds

+0

これは真実のようですが、aureliaはデータバインディングでユーザー/パスを設定していますが、これは実行時に発生するためです。 javascriptオブジェクトには型がありません。余分なメソッドは認識されません。 – xenoterracide

+0

インスタンスに 'UsernamePasswordCredentials'のオブジェクトを設定しているのですか?あるいは '{user:string、pass:string}'型のオブジェクトだけですか? –

+0

Chromeは、UsernamePasswordCredentialsで定義したようなgetterとsetterを持つ 'Object'と言っています...だからそれは余分な混乱(多分aureliaバインディングとは何かを持っている)、それは基本的にプロパティにシリアル化します。 – xenoterracide

関連する問題