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
Я ударил это снова сегодня за глупую ошибку. Это произошло потому, что номер порта был указан как часть имени хоста.
// 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 подсети.
- И выберите группу безопасности.
Я провел день, пока не нашел это исправление, надеюсь, это поможет кому-то еще.