Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将request.https响应获取到变量中_Javascript_Node.js - Fatal编程技术网

Javascript 将request.https响应获取到变量中

Javascript 将request.https响应获取到变量中,javascript,node.js,Javascript,Node.js,今天我向LinodeAPI发出了这个请求 var options = { hostname: 'api.linode.com', path: '', port: 443, method: 'GET' } var req = https.request(options, function(response) { response.setEncoding('utf8'); response.on('data', function(d) {

今天我向LinodeAPI发出了这个请求

var options = {
    hostname: 'api.linode.com',
    path: '',
    port: 443,
    method: 'GET'
}

var req = https.request(options, function(response) {
    response.setEncoding('utf8');
    response.on('data', function(d) {
        body = JSON.parse(d.toString());
    });

    response.on('end', function() {
        console.log(body);
    });
}).end();
在本例中,输出按预期工作

但是,我需要将响应放入变量中,而不是将其记录到控制台

var body = '';
var req = https.request(options, function(response) {
    response.setEncoding('utf8');
    response.on('data', function(d) {
        body = JSON.parse(d.toString());
    });
}).end();
console.log(body);
return body;
运行上述代码时,答案总是空的,因为看起来
console.log()
函数或
return
子句没有等待请求结束

我使用
setTimeout(function(){console.log(body);},2000)
函数解决了这个问题,但老实说,这并不是一个有效的解决方案,因为每个请求的超时时间都不一样

我尝试的另一个解决方案是
while(!req.finished){}console.log(body),但它也无法按预期工作

最后,我尝试添加以下内容:

response.on('end', function() {
    return body;
});
但也没有成功:(


也就是说,您有什么建议让此函数在返回
body
变量的值之前等待请求超时吗?

最简单的方法是将代码放入一个接受(至少)的函数中回调。您还需要缓冲所有
数据
事件中的数据,因为您不能假设只有一个。例如:

// you may want to add other parameters too depending on your needs of course ...
function linodeReq(cb) {
  var options = {
    hostname: 'api.linode.com',
    path: '',
    port: 443,
    method: 'GET'
  }

  https.get(options, function(response) {
    var buffer = '';
    response.on('data', function(d) {
      buffer += d;
    }).on('end', function() {
      var body;
      try {
        body = JSON.parse(buffer)
      } catch (err) {
        return cb(err);
      }
      cb(null, body);
    }).setEncoding('utf8');
  });
}

// then use it like ...

linodeReq(function(err, result) {
  // check for `err` first ...
});

您还应该处理请求(和
响应
)上的
错误
事件对象,并在发生时将其传递给回调。例如,如果主机名无法解析或出现其他连接错误,则可能会发生这种情况。

返回承诺,
然后
在实现时做些什么。@torazaburo您有任何示例吗?抱歉,我知道了,但看不到如何实现。谢谢!关于dozen或更多关于这个主题的问题。搜索它们。例如,请参阅。@torazaburo我在那里找到的问题是通过AJAX,而不是通过使用https模块的Node.js来完成的。但是,下面的答案正如预期的那样有效。感谢帮助。很高兴听到这个消息。这两个问题在概念上是相同的。“现代”做到这一点的方法是承诺。