2016-03-08 5 views
0

Я вызываю асинхронную функцию внутри функции http-запроса. Называется асинхронная функция делает еще один запрос HTTP, но запрос HTTP выдает ошибку Error: socket hang upОшибка асинхронной функции Ошибка: сокет повесил трубку

код

var http = require("http");  
    var fs = require('fs'); 

    var url_1 = "en.wikipedia.org"; 
    var url_2 = "www.twitter.com"; 

    var options = { host: url_1, port: 80, path: '', method: 'POST'};  
    var api_options = { host:url_2, port: 80,path: '',method: 'POST' }; 


function async(arg, callback) { //async function declaration 
    console.log("received argument "+ arg); 
    http.request(options, function(res){ //http request to url_2 
      console.log("also the second http request successful");//this log not getting printed, insted http.request function in the previous line throws Error : socket hang up 
      return callback(arg); 
    }); 
} 


http.request(options, function(res) { //http request url_1 
      console.log("first http request successful"); 
      async("1",function(return_value){ //calling asynchronous function 
      console.log("count : "+ return_value + " returns callback"); 
      }); 
}).end(); 

В приведенной выше коде первый я делаю запрос HTTP для url_1, После запроса ввода я вызываю вызов функции async, которая пытается выполнить http-запрос url_2, но url_2 http-запрос внутри функции async просто возвращает ошибку, о которой я упоминал выше.

Результат

first http request successful                              
received argument 1                                 
events.js:141                                  
     throw er; // Unhandled 'error' event                           
    ^                                   

Error: socket hang up                                
    at createHangUpError (_http_client.js:203:15)                         
    at Socket.socketOnEnd (_http_client.js:288:23)                         
    at emitNone (events.js:72:20)                             
    at Socket.emit (events.js:166:7)                            
    at endReadableNT (_stream_readable.js:905:12)                         
    at doNTCallback2 (node.js:441:9)                            
    at process._tickCallback (node.js:355:17)                          


Process exited with code: 1 

Я новичок в Node.js, поэтому, пожалуйста, простите, если это глупый вопрос

+0

Он задает вопрос: Правильно ли работает 'url_2', при любых условиях? – Richard

+0

Я не мог тебя достать, при любых условиях в смысле ??? , не могли бы вы, пожалуйста, более подробно –

+0

Вполне возможно, что 'url_2' закрывает TCP-соединение, по какой-то причине это не имеет никакого отношения к вашему коду. Можете ли вы прямо называть 'url_2' и получить результат? Такая ошибка выглядит так, как будто ваш запрос некорректен. – Richard

ответ

2

Для стартера: "www.twitter.com" является 301 (Moved Permanently).

Но, поскольку вы используете узел, у вас есть замечательные узловые_модули. Почему бы не использовать их?

Вот как это выглядит с got и обещает:

var request = require('got'); 

var url_1 = "en.wikipedia.org"; 
var url_2 = "google.com"; 

var options = { host: url_1, port: 80, path: '', method: 'POST'};  
var api_options = { host:url_2, port: 80,path: '',method: 'POST' }; 

request(options).then(function (res) { 
    console.log('call1 ok'); 
    return request(api_options); 
}).then(function (res) { 
    console.log('call2 ok'); 
}).catch(function (err) { 
    console.error(err); 
}); 

Чтобы установить got, просто используйте:

npm install got 

Вариант 2, если вы действительно хотите использовать модуль узла HTTP , есть эта уродливая вещь прямо здесь:

var http = require("http"); 

var url_1 = "en.wikipedia.org"; 
var url_2 = "google.com"; 

var options = { host: url_1, port: 80, path: '', method: 'POST'};  
var api_options = { host:url_2, port: 80,path: '',method: 'POST' }; 

var req1, req2; 

req1 = http.request(options, function (res) { 
    res.on('data', function() { 
     console.log('recieved data from req1') 
    }) 
    res.on('end', function() { 
     console.log('call1 ok') 
     req2 = http.request(api_options, function (res2) { 
      res2.on('end', function (body) { 
       console.log('call2 ok') 
      }); 
      res2.on('data', function() { 
       console.log('recieved data from req2') 
      }); 
     }); 
     req2.end(); 
    }); 
}); 
req1.end(); 

если вы не .end() ваш http.request(), он выдает ошибку разблокировки гнезда. См. Node documentation

+0

, он работает, спасибо –