2017-08-09 59 views
3

我已到處尋找解決此問題的答案,並嘗試了不同的建議,但我仍然無法弄清楚。異步/等待請求內部護照策略

我在創建新的SteamStrategy後使用了帶有護照的蒸汽API策略,我有一個處理我的MongoDB集合的回調函數。我基本上只是檢查當前登錄的用戶是否在數據庫中,如果沒有,然後創建一個新的用戶和.save()它到mongoDB。

這一切都工作得很好,直到我決定我想向蒸汽API請求()一些額外的用戶信息,我可以存儲到新的用戶。但是,當我嘗試將request()保存到變量和console.log()變量時,它始終表示爲null。我知道這是因爲它是異步運行的,但這就是爲什麼我使用等待,但沒有成功。我也嘗試過實現一種回調 - 地獄類型的解決方案,但遇到了一些嚴重的範圍問題,我最終聲明爲「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承諾解決響應主體。如果您需要響應代碼,但您不得不添加更多選項,但我不記得您需要atm的哪些選項。檢查文檔。 – spicypumpkin

+0

@PhillipR基本上,在我的代碼中'info'是響應體。 – spicypumpkin