2017-12-27 38 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}`); 
    }); 
} 

요청, 잘 작동 : 내 기능은 (Node.js를의 문서에서) 다음이다. 하지만 내 문제는 내 코드의 다른 곳에서는 상수 "parsedData"를 사용할 수 없다는 것입니다. 나는 내 함수에서 여러 곳에서 내

return parsedData; 

을 쓰려고했지만 내 코드에서이 함수를 사용할 때 f를 시도한다. 이자형.

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

fileContent가 정의되지 않았습니다. 그것은 parsedData가 요청에서 벗어날 수없는 것과 같습니다. 로그 된 오류가 없으며 요청은 정상적으로 처리되지만 콘텐츠를 사용할 수 없습니다.

저는 자바 전문가가 아니며, 아마도이 요청에서 가치를 반환하는 것이 잘못되었습니다.

누군가 내가 틀린 위치를 알고 있고 트릭을 할 수 있다면, 크게 감사하겠습니다! 감사합니다.

당신은 당신의 기능을위한 약속 기반의 래퍼 쓸 수
+0

과 같이 호출. 'callback','promise' 또는 새로 정의 된'async/await' 함수를 사용해야합니다. JS의 콜백 특성에 대해 배우는 것으로 시작하는 것이 좋습니다. – magreenberg

+0

사실,이 함수의 비동기 성질을 알아 채지 못했으며이를 처리 할 약속을 만드는 방법을 알지 못했습니다. [비동기 호출에서 응답을 어떻게 반환합니까? - 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 
})