2016-09-29 11 views
1

バックエンドサービスにnodejs + Expressを使用しています。約束から返された値を正しく取得する方法は?

私はsequelizeで認証を支援するためにauthenHandler.jsファイルを持っている:

module.exports = { 
    isAuthenticated: function(data) { 
    models.Users.find(data) 
     .then(function(user) { 
     if (user) { 
      return true; 
     } else { 
      return false; 
     } 
     }); 
    } 
} 

私はapp.jsで、このヘルパー関数を使用していた場合:

app.use(function(req, res, next) { 
     // process to retrieve data 
     var isAuthenticated = authProvider.isAuthenticated(data); 
     console.log(isAuthenticated); 
     if (isAuthenticated) { 
      console.log("auth passed."); 
      next(); 
     } else { 
      var err = new Error(authenticationException); 
      err.status = 403; 
      next(err); 
     } 
    } 
}) 

これは常にelseステートメントに行きますisAuthenticatedプリント行は常にundefinedを返すためです。 if-elseステートメントが呼び出された後に約束が返されたように見えます。

authenHandler.jsとapp.jsの接続方法が正確ではありません。それを行う最良の方法は何ですか?それは約束

isAuthenticated: function(data) { 
    return models.Users.find(data) 
     .then(function(user) { 
     if (user) { 
      return true; 
     } else { 
      return false; 
     } 
     }); 
    } 

を返した後、約束

authProvider.isAuthenticated(data) 
.then((result =>{ 
var isAuthenticated = result; 
    console.log(isAuthenticated); 
     if (isAuthenticated) { 
      console.log("auth passed."); 
      next(); 
     } else { 
      var err = new Error(authenticationException); 
      err.status = 403; 
      next(err); 
     } 
})) 
+0

require( 'authenHandler.js')はまだ使用していますか? –

+0

複製物の "Promise gotchas"を参照してください。 –

+0

isAuthenticated関数は、isAuthenticated関数で同じパラメータreq、resおよびnextを保持することでミドルウェアとして使用でき、関数内で日付自体を取得するために処理できます。 –

答えて

1

変更このようなアプリ.jsは

app.use(function(req, res, next) { 

     // process to retrieve data 
     authProvider.isAuthenticated(data) 
      .then(function(isAuthenticated) { 
      if (isAuthenticated) { 
       console.log("auth passed."); 
       next(); 
      } 
      else { 
       var err = new Error(authenticationException); 
       err.status = 403; 
       next(err); 
      } 
      }); 
    } 
}) 
+0

isAuthenticated関数では、私もチェックがあります: if(!data){return false;} 私はsequelize約束を呼び出す前に?データの検証を約束どおりにするにはどうすればよいですか? ありがとう! – jamesdeath123

+0

となり、結果=> {}はどういう意味ですか?私はnodejsの有効な構文だとは思わない? – jamesdeath123

+0

()=> {}はes6 arrow関数です。これは古いバージョンでは 'function(){}'と書くことができます。ノードは矢印関数をサポートします。 (バージョンの互換性を参照)。 最初の質問が理解できませんでした。 – theAnubhav

1

あなたapp.jsが間違っている、にisAuthenticatedリターンはあなたが変更する必要がBOOL

を返さないと約束消費する

+0

私はauthProvider.isAuthenticated()を変更して約束を返す必要があるようですか?私はどうしたらいいですか? – jamesdeath123

+0

@ jamesdeath123 models.Users.xxxxxの前に "return"を追加する必要があります –

関連する問題