使用HTTPS GET请求的结果[Node.js]

3
我遇到了一个小问题,我想用Node.js的HTTPS GET请求将远程JSON加载到变量中。虽然成功了,但我无法在代码其他地方使用它。以下是我的函数(来自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}`);
  });
}

请求很正常,因为我能够在控制台中正确地记录我的 .json。但我的问题是,我无法在代码的任何其他地方使用常量“parsedData”。我试图编写我的

return parsedData;

在我的函数中有几个地方,但当我在代码中使用该函数并尝试进行f.e.时。
var fileContent = getMyFile();
console.log(fileContent);

fileContent未定义。就像parsedData无法从请求中出来一样。没有错误记录,请求正常进行,但我只是不能使用其中的内容。

我不是JavaScript专业人士,可能是我在返回该请求的值方面做错了什么。

如果有人知道我错在哪里以及可以解决问题的方法,将不胜感激!谢谢!


你不能从异步函数中返回值。你需要使用callbackpromise或者新定义的async / await函数。我建议你先学习一下JS的回调特性。 - mattdevio
确实,我没有注意到这个函数的异步性质,并且不知道如何创建一个Promise来处理它。我阅读了如何从异步调用中返回响应?- Robby Cornelissen以便理解,并且@31piy和js_noob的回答非常有帮助! - Jason M
2个回答

20
你可以为你的函数编写一个基于Promise的包装器:

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

像这样来调用
getMyFile().then((parsedData)=>{
    //parsedData is the returned value u needed
}).catch((error)=>{
    //if any error handle it
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接