私はこの問題を解決し、さまざまな提案を試みたが、私はまだこれを理解することができない。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);
}
)
);
どうすればコールバックなしでボディーを返すことができますか? – Phillip
@PhillipR約束は応答の本文を解決します。レスポンスコードが必要な場合とそうでない場合はオプションを追加する必要がありますが、どのオプションが必要かを正確に覚えていません。ドキュメントを確認してください。 – spicypumpkin
@PhillipR基本的に、私のコードの 'info'はレスポンスボディです。 – spicypumpkin