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

Обновление - Ответил сам

Я вижу, что нужно убедиться, что DNS разрешен правильно с компьютера, ознакомьтесь с документацией по узлу, чтобы убедиться, что домен разрешаем.

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

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

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…');
}

8 ответов

Решение

Я видел, как это происходит, когда ваш хост (который вы передаете как 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

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

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

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

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

https://github.com/mikeal/request

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам