2017-12-27 21 views
1

Ich bin mit einem kleinen Problem fest, denke ich, aber ich kann keinen Weg finden, es zu lösen. Ich möchte einen Remote-JSON in einer Variablen mithilfe der Node.js-HTTPS-GET-Anforderung laden. Es ist ein Erfolg, aber ich kann es nirgendwo anders in meinem Code verwenden. Meine Funktion ist die folgende (von Node.js doc):Verwenden Sie das Ergebnis der HTTPS-GET-Anfrage [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}`); 
    }); 
} 

Die Anfrage funktioniert gut, wie ich in der Lage bin meine .json in der Konsole korrekt anzumelden. Aber mein Problem ist, dass ich die Konstante "parsedData" nirgendwo anders in meinem Code verwenden kann. Ich habe versucht, meine

an mehreren Stellen in meiner Funktion zu schreiben, aber wenn ich die Funktion in meinem Code und versuchen f. e.

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

dateiinhalt ist nicht definiert. Es ist wie parsedData kann nicht aus der Anfrage gehen. Es wird kein Fehler protokolliert, die Anfrage geht gut, aber ich kann den Inhalt einfach nicht verwenden.

Ich bin kein Javascript-Experte, und es ist wahrscheinlich etwas, was ich falsch mit der Rückgabe von Wert aus dieser Anfrage.

Wenn jemand weiß, wo ich falsch liege und was könnte, wird es sehr geschätzt werden! Danke!

+0

Sie nicht Werte von Asynchron-Funktionen zurückkehren können. Sie müssen entweder 'callback', ein' Versprechen' oder die neu definierten 'async/wait' Funktionen verwenden. Ich würde vorschlagen, dass Sie damit anfangen, etwas über den Rückrufcharakter von JS zu lernen. – magreenberg

+0

Tatsächlich habe ich die asynchrone Natur dieser Funktion nicht bemerkt und wusste nicht, wie ich ein Versprechen erstellen sollte, um damit umzugehen. Ich lese [Wie gebe ich die Antwort von einem asynchronen Anruf zurück? - Robby Cornelissen] (https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) zu verstehen, und Antworten von @ 31py und js_noob waren sehr hilfreich ! –

Antwort

0

Sie könnten ein Versprechen basierte Wrapper für Ihre Funktion schreiben:

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}`); 
 
     }); 
 

 
    }); 
 
    }

Damit können Sie die Funktion wie folgt verwendet werden:

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) 
 
    }) 
 
}

nennen es wie dieses

getMyFile().then((parsedData)=>{ 
    //parsedData is the returned value u needed 
}).catch((error)=>{ 
    //if any error handle it 
}) 
Verwandte Themen