2015-01-26 5 views
0

Я просто пытаюсь отправить запрос на получение API. Я получаю ответ 200, но ни одна из функций обратного вызова, похоже, не происходит, включая конец. Вот соответствующий раздел, у меня также есть остальная часть экспресс-сервера, и сервер работает.Функции обратного вызова из https-ответа не запускаются в nodejs

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, и вы можете увидеть данные и URL действительны, если вы идете в address. Ни один из отпечатков после первого обратного вызова не происходит.

Edit: Это работает, если я использую метод полной 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(); 

Я до сих пор не знаю, почему оригинал не работает.

+0

Я не совсем уверен, если вы можете использовать путь в формате domin '('https://tfe-opendata.com/api/v1/stops')', возможно, вам нужно использовать абсолютный путь, например '('/ api/v1/stops') ' –

+0

Вы можете видеть, что они делают это в документации http://nodejs.org/api/https.html#https_https_get_options_callback – michaelAdam

ответ

2

Это потому, что вы не можете позвонить .on('data',) по адресу get, он должен быть на экземпляре внутри обратного вызова.

Лучшей альтернативой является, вероятно, просто использование библиотеки, которая абстрагирует эти детали низкого уровня для вас (например, request).

+0

Спасибо, я фи он был таким, потому что есть https.on ('error'). – michaelAdam

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."); 
    }); 
}); 
+0

Спасибо вам обоим. Небольшой вопрос: в чем разница между console.log и process.stdout.write? – michaelAdam

+0

См. Ответ в этом вопросе SO http://stackoverflow.com/questions/4976466/difference-between-process-stdout-write-and-console-log-in-node-js –

Смежные вопросы