Ошибка "сокета повредить" во время запроса
Я пытаюсь сделать запрос GET на какой-то сайт (не мой собственный сайт) через http-модуль node.js версии 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()
В ходе этой операции появляется следующая ошибка: {[Ошибка: сокет]: "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)
Я пытаюсь найти решение в Интернете, но до сих пор не нашел их. Как решить эту проблему?
Ответы
Ответ 1
Я наконец обнаружил проблему и выяснил решение. Проблема заключалась в том, что я использую прокси-сервер для подключения к Интернету. Вот рабочий код:
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()
Спасибо всем за помощь и предложения!
Ответ 2
Вы должны завершить запрос. Добавьте это в конец вашего script:
req.end()
Ответ 3
При использовании http.request()
вам нужно в какой-то момент позвонить request.end()
.
req = http.request options, (res) ->
# ...
req.on 'error', # ...
req.end() # <---
До тех пор, request
остается открытым, чтобы позволить писать тело. И эта ошибка возникает из-за того, что сервер в конечном итоге будет считать, что соединение имеет тайм-аут и закроет его.
В качестве альтернативы вы также можете использовать http.get()
с запросами GET
, которые будут вызывать .end()
автоматически, так как запросы GET
обычно не имеют тела.
Ответ 4
в моем случае это был заголовок 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', это отсортировано.
Ответ 5
Я обнаружил, что это произошло в еще одном случае, когда я отправлял пустое тело типа - '{}' в операцию удаления, вызванной intern рамки для тестирования;
вместо этого я использовал null для отправки в качестве значения параметра body при прохождении запроса через
Ответ 6
В моем случае после обновления до 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);
Ответ 7
При обновлении с 0,10.33 до 0,12 узла nodejs эта ошибка была удалена.
В моем случае для запроса удаления было тело (json). Раньше клиент node устанавливал - "передача-кодирование" как chunked - по умолчанию, когда "длина контента" не задана. Похоже, в последней версии клиент node остановил настройку передачи-кодировки по умолчанию.
Исправлено было установить его в запросе.