asynchronous/等待请求内部护照策略

我到处寻找解决这个问题的答案,并尝试了不同的build议,但我仍然无法弄清楚。

我在护照中使用Steam API策略,在创build新的SteamStrategy后,我有一个callback函数来处理我的MongoDB集合。 我基本上只是检查当前login的用户是否在数据库中,如果没有,然后创build一个新的用户和.save()它到mongoDB。

这一切都工作正常,直到我决定我想要一个请求()蒸汽API一些额外的用户信息,我可以存储到新的用户。

但是,当我尝试将request()保存到variables和console.log()variables时,它总是表示为空。 我知道这是因为它是asynchronous运行的,但这就是为什么我等待,但没有成功。 我也尝试过实现一个callback – 地狱types的解决scheme,但遇到了一些严重的范围问题,我最后的陈述“return done(null,user)”;

无论如何。 如果有人能解释我的问题并提供解决scheme,那就太好了,谢谢!

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); } ) ); 

问题是,你正在使用await和一个callback在同一时间。 你不应该。 此外, request模块不使用承诺 – 您需要request-promise而这基本上是一个request模块的包装,让您使用承诺。

 const request = require("request-promise"); let info = {}; try { info = await request(steamURL); console.log(info); } catch (err) { /* Handle error */ }