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

Nodejs httprequest с данными - получение ошибки getaddrinfo ENOENT

Обновление - ответили самим Я вижу, что нужно убедиться, что DNS правильно разрешен с компьютера, проверьте этот код, чтобы убедиться, что URL-адрес достигнут nodejs.org/docs/latest/api/dns.html#dns.resolve

Оригинальный вопрос

Я пишу программу на основе узлов, в которой пользователь может попросить меня сделать httprequest от их имени {с курса они предоставляют мне некоторые данные и метод для вызова с}, но каждый раз, когда я делаю http-запрос, он дает меня ошибка

getaddrinfo ENOENT так выглядит мой код

function makehttprequest(deviceid, httpaction, httppath,methods, actiondata, callback) {
console.log('we are here with httpaction' + httpaction + ' path ' + httppath + ' method ' + methods + ' action data ' + actiondata);
 //do the http post work, get the data, and call the callback function with return data
 var options = {
   host: httpaction,
   port: 80,
   path: httppath,
   method: methods
 };

    try {
      var req = http.request(options, function(res) {
        console.log('STATUS: ' + res.statusCode);
        console.log('HEADERS: ' + JSON.stringify(res.headers));
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
          console.log('BODY: ' + chunk);
        });
      });
    } catch(e) {
      console.log('error as : ' + e.message);
    }

    req.on('error', function(e) {
      console.log('problem with request: ' + e.message);
    });

    // write data to request body
    console.log('writing data to request ..');
    req.write(actiondata);
    console.log('finished writing data to request…');
    req.end();
    console.log('request ended…');
}
4b9b3361

Ответ 1

Я видел, как это происходит, когда ваш хост (который вы передаете как httpaction) имеет схему (так "http://" ) перед ней. Ваш хост должен быть строго таким доменом, как "www.google.com", а не " http://www.google.com" или "www.google.com/hello- world" или " http://www.google.com/hello-world".

Храните его только в домене.

Вот пример: http://allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html

Ответ 2

Проблема также может возникнуть, если у вас есть конечная косая черта:

Хорошо: "www.google.com"

Плохо: "www.google.com/"

Ответ 3

Избегайте всех этих проблем с именем хоста/протокола/порта/слэша с помощью модуля request вместо http

https://github.com/mikeal/request

Ответ 4

Я получал [Error: Getaddrinfo ENOENT], но это было сразу после получения [Error: connect EMFILE]; поскольку я выполняю тесты нагрузки с тысячами клиентов, ошибка EMFILE (основная причина) была непрозрачной. Решение было то же, что и для EMFILE: увеличьте количество дескрипторов файлов. Просто добавьте его здесь для полноты, если у кого-то другая проблема.

Ответ 5

Я ударил это снова сегодня за глупую ошибку. Это было потому, что номер порта был помещен как часть имени хоста.

// wrong. gets error getaddrinfo ENOENT
var options = {
  hostName: 'localhost:1337',
  ....
}

// correct
var options = {
    hostname: 'localhost',
    port: 1337,
};

Ответ 6

Я получал эту ошибку при вызове server.listen(PORT, HOST);, где HOST не удалось восстановить на локальном компьютере.

Как только я изменил это на имя хоста/доменное имя /ip, с которым разрешен локальный компьютер, эта ошибка исчезла.

Поскольку я пытался подключиться через имя хоста для целей dev, я добавил запись в файл hosts с требуемым именем хоста и обеспечил соответствие этого имени хосту server.listen()

Ответ 7

Если весь ваш код выглядит нормально, и вы по-прежнему получаете ту же ошибку, что было моим делом, решение проверяло серверы имен в моем файле /etc/resolv.conf.

Я добавил сервер имен Google в начале моего файла resolv.conf (8.8.8.8), и код снова начал работать отлично, больше не было ошибок.

Стоит заметить, что эта ошибка возникла у меня 4 февраля 2015 года после того, как я запустил sudo apt-get upgrade, мне нужно было обновить js node, и появилась ошибка, которая казалась несовместимой с серверами имен, которые у меня были.

Сначала я проверил, были ли у меня какие-либо проблемы с DNS, извлекая нужный URL-адрес, используя wget в командной строке, я получил содержимое целевого URL-адреса, поэтому я не думал, что это действительно проблема DNS, но это было.

Ответ 8

У меня была аналогичная проблема, но я работал как функция AWS Lambda, поэтому, если кто-то сталкивается с этой проблемой с функциями Lambda, это то, как я ее разрешил.

  • Дайте вашей лямбда-функции VPC.
  • Выберите не менее 2 подсетей.
  • И выберите группу безопасности.

Я провел день, пока не нашел это исправление, надеюсь, что это поможет кому-то другому.