Подтвердить что ты не робот

Ошибка "сокета повредить" во время запроса

Я пытаюсь сделать запрос 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)

Я пытаюсь найти решение в Интернете, но до сих пор не нашел их. Как решить эту проблему?

4b9b3361

Ответ 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 остановил настройку передачи-кодировки по умолчанию.

Исправлено было установить его в запросе.