2017-08-09 45 views
3

私はこの問題を解決し、さまざまな提案を試みたが、私はまだこれを理解することができない。Passportストラテジー内のAsync/Await Request

私は新しいSteamStrategyを作成した後、私のMongoDBコレクションを処理するコールバック関数を持っています。私は基本的には、現在ログインしているユーザーがデータベースにいるかどうかをチェックしています。そうでなければ、新しいユーザーを作成し、mongoDBに.save()します。

これは、私が新しいユーザーに保存できる追加のユーザー情報のためにsteam APIにリクエスト()を行いたいと思うまでうまくいきました。

ただし、request()を変数に、console.log()に変数を保存しようとすると、常にnullが返されます。私はそれが非同期に実行されているためだと分かっていますが、それが私が待ち望んだ理由ですが、成功はありません。また、コールバック・ヘル(callback-hell)タイプのソリューションを実装しようとしましたが、「return done(null、user)」という最終的な記述で厳しいスコープの問題に遭遇しました。

とにかく。もし誰かが私の問題を説明して解決策を提供できれば、それは素晴らしいことでしょう、ありがとう!

passport.use(
     new SteamStrategy(
     { 
      returnURL: keys.returnURL, 
      realm: keys.realm, 
      apiKey: keys.steamAPI, 
      proxy: true 
     }, 
     async function(identifier, profile, done) { 
      const existingUser = await User.findOne({ 
      steamInfo: { id: profile._json.steamid } 
      }); 

      if (existingUser) { 
      middleware.updateMongo(existingUser); 
      return done(null, existingUser); 
      } 

      ////////////////////////THE PROBLEM STARTS HERE///////////////////// 
      const steamURL = "hiding url for post"; 

      const info = await request(steamURL, function(error, response, body) { 
      if (!error && response.statusCode == 200) { 
       console.log(JSON.parse(body)); //THIS PRINTS OUT THE INFO PERFECTLY 
       return JSON.parse(body); 
      } 
      }); 


      console.log(info); //THIS WILL ALWAYS SHOW AS NULL OR UNDEFINED 

      const user = await new User({ 
      steamInfo: { 
       id: profile._json.steamid, 
       persona: info.personaname, 
       profileUrl: info.profileurl, 
       avatar: info.avatarmedium, 
       personaState: info.personastate, 
       visibility: info.communityvisibilitystate, 
       countryCode: info.loccountrycode 
      }, 
      collectedInfo: { rank: "", reports: "0" } 
      }).save(); 

      return done(null, user); 
     } 
    ) 
    ); 

答えて

2

問題は、awaitとコールバックを同時に使用していることです。あなたはしないでください。また、requestモジュールは約束を使用しません。request-promiseが代わりに必要です。これは基本的に、約束を扱うためのrequestモジュールのラッパーです。

const request = require("request-promise"); 

let info = {}; 
try { 
    info = await request(steamURL); 
    console.log(info); 
} 
catch (err) { 
    /* Handle error */ 
} 
+0

どうすればコールバックなしでボディーを返すことができますか? – Phillip

+0

@PhillipR約束は応答の本文を解決します。レスポンスコードが必要な場合とそうでない場合はオプションを追加する必要がありますが、どのオプションが必要かを正確に覚えていません。ドキュメントを確認してください。 – spicypumpkin

+0

@PhillipR基本的に、私のコードの 'info'はレスポンスボディです。 – spicypumpkin

関連する問題