2016-09-13 5 views
0

Я пытаюсь установить http.request в узел. Но мой тестовый сценарий просто не заканчивается.Почему http.request никогда не получает ответ?

  • Что не так?
  • Как отладить этот скрипт?

Thx!

const http = require('http'); 
const parse_url = require('url').parse; 

const srv = http.createServer(function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('okay'); 
}); 
srv.listen(0); 

const addr = srv.address(); 
const url = `http://localhost:${addr.port}`; 
const url_obj = parse_url(url); 

const option = { 
    protocol: url_obj.protocol, 
    host: url_obj.host, 
    hostname: url_obj.hostname, 
    port: addr.port, 
    path: '/', 
    method: 'GET' 
}; 
console.log(option); 
const req = http.request(option, (res) => { 
    console.log('done'); 
    srv.close(); 
}); 

// below is only for debugging 

req.on('error', (e) => { 
    console.log(`problem with request: ${e.message}`); 
}); 

req.on('socket', (socket) => { 
    console.log('socket event'); 

    socket.on('data', function() { 
    console.log('data', arguments); 
    }); 
    socket.on('lookup', function() { 
    console.log('lookup', arguments); 
    }); 
    socket.on('end', function() { 
    console.log('end', arguments); 
    }); 

}); 

Вот консольный вывод:

$ node t.js 
{ protocol: 'http:', 
    host: 'localhost:43347', 
    hostname: 'localhost', 
    port: 43347, 
    path: '/', 
    method: 'GET' } 
socket event 
lookup { '0': null, '1': '127.0.0.1', '2': 4, '3': 'localhost' } 

И сценарий никогда не выйти. В идеале он должен выйти на srv.close()

+0

Что такое запрос? Какие сообщения консоли выводят код? – JJJ

+0

@Juhana 'req' - это запрос. – zjk

+0

Нет, я имею в виду, какой запрос вы делаете на клиенте. Розетки не закрываются автоматически, если ни одна из сторон не закрывает их; вот и вся идея сокетов. – JJJ

ответ

1

Я пропустил это предложение в документе

Обратите внимание, что в примере req.end() был вызван. С помощью http.request() один должен всегда вызывать req.end(), чтобы указать, что вы закончили с запросом - даже если в тело запроса нет данных.

https://nodejs.org/api/http.html#http_http_request_options_callback

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