Async / Await请求内部Passport策略

时间:2017-08-09 07:20:33

标签: javascript node.js mongodb async-await passport.js

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

我使用带有护照的Steam API策略,在创建新的SteamStrategy后,我有一个回调函数来处理我的MongoDB集合。我基本上只是检查当前登录的用户是否在数据库中,如果没有,则创建一个新用户,并将.save()创建到mongoDB中。

这一切都运行正常,直到我决定向steam 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);
        }
      )
    );

1 个答案:

答案 0 :(得分:2)

问题在于您同时使用request和回调。你不应该。此外,request-promise模块不使用promises - 您需要使用request,这基本上是const request = require("request-promise"); let info = {}; try { info = await request(steamURL); console.log(info); } catch (err) { /* Handle error */ } 模块的包装器,可以让您使用promises。

<div id="sidebar-wrapper">
<div class="navbar-wrapper">
    <nav class="navbar navbar-default navbar-fixed-top" role="navigation">
       <div class="container-fluid" id="navfluid">
            <div class="navbar-brand">
                <a id="menu-toggle" href="#" style="padding-left: 20px;"><i class="fa fa-bars"></i></a>
            </div>
            <span class="navbar-text visible-xs-inline-block visible-sm-inline-block visible-lg-inline-block">
                <span id="tab_name"></span>
            </span>
        </div>
    </nav>
</div>
<nav class="navbar navbar-default navbar-fixed-left">
    <ul class="nav navbar-nav tabs" id="myTab" align="center">
        <!-- items -->
    </ul>
</nav>