Ошибка "Socket hang up" во время запроса
Я пытаюсь сделать запрос GET на какой-то сайт (не мой собственный сайт) через http-модуль узла.Яш версию 0.8.14. Вот мой код (CoffeeScript):
options =
host: 'www.ya.ru'
method: 'GET'
req = http.request options, (res) ->
output = ''
console.log 'STATUS: ' + res.statusCode
res.on 'data', (chunk) ->
console.log 'A new chunk: ', chunk
output += chunk
res.on 'end', () ->
console.log output
console.log 'End GET Request'
req.on 'error', (err) ->
console.log 'Error: ', err
req.end()
во время этой операции я получаю следующую ошибку: { [Ошибка: socket hang up] код: 'ECONNRESET' }. Если я прокомментирую обработчик ошибок, мое приложение завершится со следующей ошибкой:
events.js:48
throw arguments[1]; // Unhandled 'error' event
^
Error: socket hang up
at createHangUpError (http.js:1091:15)
at Socket.onend (http.js:1154:27)
at TCP.onread (net.js:363:26)
Я пытаюсь найти решение в интернете, но до сих пор не нашли их. Как решить эту проблему?
7 ответов
при использовании http.request()
, вы должны в какой-то момент вызов request.end()
.
req = http.request options, (res) ->
# ...
req.on 'error', # ...
req.end() # <---
до request
остается открытым, чтобы разрешить написании тело. И ошибка заключается в том, что сервер в конечном итоге сочтет соединение истекшим и закроет его.
кроме того, вы также можете использовать http.get()
С GET
запросы, которые будем называть .end()
автоматически начиная с GET
запросы обычно не ожидается, что тело.
в моем случае это был 'Content-Length' заголовок-я вытащил его, и теперь все в порядке...
код:
function sendRequest(data)
{
var options = {
hostname: host,
path: reqPath,
port: port,
method: method,
headers: {
'Content-Length': '100'
}
var req = http.request(options, callback);
req.end();
};
после удаления строки: 'Content-Length':'100' он разобрался.
Я, наконец, обнаружил проблему и нашли решение. Проблема в том, что я использую прокси-сервер для подключения к интернету. Вот рабочий код:
options =
hostname: 'myproxy.ru'
path: 'http://www.ya.ru'
port: 3128
headers: {
Host: "www.ya.ru"
}
req = http.request options, (res) ->
output = ''
console.log 'STATUS: ' + res.statusCode
res.on 'data', (chunk) ->
console.log 'A new chunk: ', chunk
output += chunk
res.on 'end', () ->
console.log output
console.log 'End GET Request'
req.on 'error', (err) ->
console.log 'Error: ', err
req.end()
спасибо всем за помощь и предложения!
Я обнаружил, что это происходит в одном случае, когда я отправлял пустое тело, как - '{}' в операции delete вызывается из интерн фреймворк для тестирования; вместо этого я использовал null для отправки в качестве значения параметра body при выполнении запроса через
при обновлении с 0.10.33 до 0.12 nodejs эта ошибка была нажата.
в моем случае для запроса на удаление было тело (json). Ранее клиент узла устанавливал-' transfer - encoding 'как chunked-по умолчанию, когда" content-length " не установлен. Кажется, в последней версии клиент узла перестал устанавливать передачу-кодирование по умолчанию.
Fix должен был установить его в запросе.
в моем случае, после обновления до node 8.0.0
пост не работает. добавление Content-Length
заголовок не помогает. Нужно добавить 'Connection': 'keep-alive'
до заголовок чтобы получить эту ошибку подальше.
let postOptions = {
method: 'POST',
form: form,
url: finalUrl,
followRedirect: false,
headers:{
'Connection': 'keep-alive'
}
};
request(postOptions, handleSAMLResponse);