来自https响应的回调函数未在nodejs中触发

时间:2015-01-26 13:06:51

标签: node.js express

我只是想向API发送get请求。我得到200响应,但没有一个回调函数似乎发生,包括结束。 这是相关部分,我还有快速服务器的其余部分,服务器正在运行。

var https = require("https");

https.get("https://tfe-opendata.com/api/v1/stops", function(res){
    console.log("Response: ", res.statusCode);
    console.log("Res: " + res);
}).on('data', function(data) {
    console.log('blah');
    console.log("data: " + data); 
    process.stdout.write(data);
}).on('error', function(error) {
    console.error('Error ' + error);
}).on('end', function(){
    console.log("End.");
});

它应该只返回JSON,如果你转到address,你可以看到数据和网址是有效的。 第一次回调发生后没有任何打印。

编辑:如果我使用完整的https.request方法

,它会起作用
var options = {
    host: 'tfe-opendata.com',
    path: '/api/v1/stops',
    method: 'GET'
}

var httpreq = https.request(options, function(response) {
    response.on('data', function(chunk) {
    console.log("data " + chunk);
    });
});

httpreq.on('error', function(e) {
    console.log('error: ' + e);
});

httpreq.end();

我仍然不知道为什么原作不起作用。

2 个答案:

答案 0 :(得分:2)

这是因为您无法在.on('data', )的结果上调用get,它必须位于回调内的response实例上。

更好的选择可能只是使用一个为您提取这些低级别详细信息的库(例如request)。

答案 1 :(得分:1)

您对使用API​​感到困惑,但您并未真正调用on返回的对象上的https.get函数,而是通过res执行此操作从回调函数参数提供的对象。

代码由它自己说话,所以不要这样做:

var https = require("https");

https.get("https://tfe-opendata.com/api/v1/stops", function(res) {
   console.log("Response: ", res.statusCode);
   console.log("Res: " + res);
}).on('data', function(data) {
   console.log('blah');
   console.log("data: " + data);
   process.stdout.write(data);
}).on('error', function(error) {
   console.error('Error ' + error);
}).on('end', function(){
   console.log("End.");
});

你应该这样做:

https.get("https://tfe-opendata.com/api/v1/stops", function(res) {
   console.log("Response: ", res.statusCode);
   console.log("Res: " + res);
   res.on('data', function(data) {
      console.log('blah');
      console.log("data: " + data);
      process.stdout.write(data);
   }).on('error', function(error) {
      console.error('Error ' + error);
   }).on('end', function(){
      console.log("End.");
   });
});