Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Passport策略中的异步/等待请求_Javascript_Node.js_Mongodb_Async Await_Passport.js - Fatal编程技术网

Javascript Passport策略中的异步/等待请求

Javascript Passport策略中的异步/等待请求,javascript,node.js,mongodb,async-await,passport.js,Javascript,Node.js,Mongodb,Async Await,Passport.js,我到处寻找解决这个问题的答案,并尝试了不同的建议,但我仍然无法找到答案 我在passport中使用steam API策略,在创建新的steam策略之后,我有一个回调函数来处理我的MongoDB集合。我基本上只是检查当前登录的用户是否在数据库中,如果不在,则创建一个新用户并将其.save()保存到mongoDB中 这一切都很好,直到我决定向steam API发出一个请求(),以获取一些额外的用户信息,以便存储到新用户中 但是,当我尝试将request()保存到变量并将console.log()保存

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

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

这一切都很好,直到我决定向steam API发出一个请求(),以获取一些额外的用户信息,以便存储到新用户中

但是,当我尝试将request()保存到变量并将console.log()保存到变量时,它总是显示null。我知道这是因为它是异步运行的,但这就是为什么我使用wait,但没有成功。我还尝试实现一种回调地狱类型的解决方案,但在最后一句“returndone(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);
        }
      )
    );

问题是您同时使用了
wait
和回调。你不应该。另外,
请求
模块不使用承诺-您需要使用
请求承诺
,它基本上是
请求
模块的包装,让您可以使用承诺

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

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

那么,如果没有回调,我如何返回身体?@PhillipR the promise解析了回应身体。如果你想要响应代码,你必须添加更多的选项,但我不记得你到底需要哪些选项。检查文档。@PhillipR基本上,在我的代码
info
中是响应主体。非常感谢!!成功了。我只花了两行代码(说真的),我花了两个小时试图弄明白-_-@菲利浦:哈哈,真的发生了。请注意,许多节点包都有一个单独的promisified模块(如
请求承诺
chai as promised
),因此如果文档没有明确说明函数返回承诺,您应该查找它们。