2017-12-27 16 views
1

私は思った小さな問題に固執していますが、解決方法を見つけることができません。 Node.js HTTPS GETリクエストを使用して、変数にリモートJSONをロードしたいとします。それは成功ですが、私のコードのどこにでも使用することはできません。私が正しくコンソールで私の.jsonを記録することができる午前としてHTTPS GETリクエストの結果を使用する[Node.js]

function getMyFile() { 
    var https = require('https'); 

    https.get('URL_I_am_targeting/file.json', (res) => { 
    var { statusCode } = res; 
    var contentType = res.headers['content-type']; 

    let error; 

    if (statusCode !== 200) { 
     error = new Error('Request Failed.\n' + 
         `Status Code: ${statusCode}`); 
    } else if (!/^application\/json/.test(contentType)) { 
     error = new Error('Invalid content-type.\n' + 
         `Expected application/json but received ${contentType}`); 
    } 

    if (error) { 
     console.error(error.message); 
     // consume response data to free up memory 
     res.resume(); 
    } 

    res.setEncoding('utf8'); 
    let rawData = ''; 

    res.on('data', (chunk) => { 
     rawData += chunk; 
    }); 

    res.on('end',() => { 
     try { 
     const parsedData = JSON.parse(rawData); 
     console.log(parsedData); 
     } catch (e) { 
     console.error(e.message); 
     } 
    }); 
    }).on('error', (e) => { 
    console.error(`Got error: ${e.message}`); 
    }); 
} 

要求、正常に動作します:My機能は、(Node.jsのドキュメントから)以下です。しかし、私の問題は、コード内のどこにでも定数 "parsedData"を使用できないことです。

return parsedData; 

を私の関数にいくつかの場所で書こうとしましたが、私のコードでこの関数を使ってfを試してみました。 e。

var fileContent = getMyFile(); 
console.log(fileContent); 

fileContentは未定義です。それはparsedDataのような要求から外に出ることはできません。ログにはエラーは記録されません。要求は正常に処理されますが、コンテンツを使用できません。

私はJavascriptの専門家ではありません。おそらく、このリクエストから値を返すと間違っていると思われます。

誰かが私が間違っていることを知っていて、何ができたら、それは大いに評価されます! ありがとう!

+0

のようにそれを呼び出します。 'callback'、' promise'、または新しく定義された 'async/await'関数を使う必要があります。私はあなたがJSのコールバックの性質について学ぶことから始めることをお勧めします。 – magreenberg

+0

実際、私はこの関数の非同期性に気づいておらず、それを処理するPromiseを作成する方法を知らなかった。私は[非同期呼び出しからの応答をどのように返すのですか? - Robby Cornelissen](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call)を理解し、@ 31piyとjs_noobからの回答が非常に役に立ちました! –

答えて

0

あなたは、あなたの関数のための約束に基づくラッパー書くことができます:

getMyFile() 
    .then(response => { 
    // handle success response here 
    }) 
    .catch(error => { 
    // handle error here 
    }); 
0

function getMyFile() { 
 
    return new Promise((resolve,reject)=>{ 
 
    //your logic and data manipulations here and finally resolve the variable 
 
    
 
    resolve(parsedData) 
 
    }) 
 
}
:あなたはこのような関数を使用することができ、そのので

function getMyFile() { 
 
    var https = require('https'); 
 

 
    return new Promise((resolve, reject) => { 
 
     https.get('URL_I_am_targeting/file.json', (res) => { 
 
     var { statusCode } = res; 
 
     var contentType = res.headers['content-type']; 
 

 
     let error; 
 

 
     if (statusCode !== 200) { 
 
      error = new Error('Request Failed.\n' + 
 
      `Status Code: ${statusCode}`); 
 
     } else if (!/^application\/json/.test(contentType)) { 
 
      error = new Error('Invalid content-type.\n' + 
 
      `Expected application/json but received ${contentType}`); 
 
     } 
 

 
     if (error) { 
 
      console.error(error.message); 
 
      // consume response data to free up memory 
 
      res.resume(); 
 
     } 
 

 
     res.setEncoding('utf8'); 
 
     let rawData = ''; 
 

 
     res.on('data', (chunk) => { 
 
      rawData += chunk; 
 
     }); 
 

 
     res.on('end',() => { 
 
      try { 
 
      const parsedData = JSON.parse(rawData); 
 
      resolve(parsedData); 
 
      } catch (e) { 
 
      reject(e.message); 
 
      } 
 
     }); 
 
     }).on('error', (e) => { 
 
     reject(`Got error: ${e.message}`); 
 
     }); 
 

 
    }); 
 
    }

はあなたが非同期関数から値を返すことはできません。この

getMyFile().then((parsedData)=>{ 
    //parsedData is the returned value u needed 
}).catch((error)=>{ 
    //if any error handle it 
}) 
関連する問題