2016-07-31 2 views
1

OTPベース認証用のカスタムログインハンドラを登録しています。上記のコードhandelLogin(loginRequest)Meteor.jsの内部で非同期コードを処理する方法Accounts.registerLoginHandler

Accounts.registerLoginHandler(async function(loginRequest){ 
    if (!loginRequest.sms) return; 
    let user = await handelLogin(loginRequest); 
    console.log(user); 
    return user; 
}); 

非同期関数であり、ネットワーク要求を行うとOTPコードを検証した後{userId:'.....'}を返します。 は、クライアントからこのログインハンドラーと呼ばれるとき、私はいくつかは、私が値を持っているし、それを返すためにuser変数を待つ必要が見つかっグーグルで、このエラー

Exception while invoking method 'login' Error: A login method must  specify a userId or an error 

を取得していますので、私は上記のコードでasyncawaitを使用しました。 しかし、まだ同じエラーが発生しています。

この「ログイン」エラーの後、このコードからのconsole.log(user);はしばらくしてからサーバーコンソールに記録されます。

  1. なぜ返りませんuser
  2. これを達成するための提案や方法があります。
+0

彼はloginメソッドは、userIdを、またはエラー –

+0

待ちを指定する必要がありますを示しています。 Meteorではいつasync/awaitを使用できますか? Ooy –

+0

ねえ、しかし、私のhandelLogin(loginRequest)は非同期なので、Accounts.registerLoginHandlerのコールバックは、ユーザ変数がある値かエラーを持つのを待ってからそれを返す必要があります。しかし、私はそれがログインエラーを引き起こしている未定義を返すと思います。そこで、非同期コードが完了するのを待つ良い方法はありますか? –

答えて

0

Accounts.registerLoginHandler()は非同期/待機の準備ができていません。それは、プロミスではなく、機能を期待している。 (非同期関数はPromiseを返します)。

はい、Promisesとasync/awaitを独自のサーバー側コードで使用できますが、この特定のケースでは使用できません。

仕事にこれを取得する最も簡単な方法は、あなたがhandleLogin()の署名を変更するために自由であると仮定し、その最後の引数としてcallback(error, result)機能を有するの古いNodeJS大会への約束を返すからそれを変換することで、 Meteor.wrapAsync()でその呼び出しをラップします。 (修正handleLoginを(使用))

あなたのコードは次のようになり:

Accounts.registerLoginHandler(function(loginRequest){ 
    ... 
    let handleLoginSync = Meteor.wrapAsync(handleLogin, this); // Change 'this' to whatever context handleLogin expects. 
    let user = handelLoginSync(loginRequest); 
    ... 
}); 
+0

おかげさまで私はそれを試み、あなたに知らせます。 –

関連する問題