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…');
}
Ответы
Ответ 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 подсетей.
- И выберите группу безопасности.
Я провел день, пока не нашел это исправление, надеюсь, что это поможет кому-то другому.