Node.js nodejs httprequest带有数据-获取错误getaddrinfo Enoint 更新-自行回答
我看到一个人必须确保DNS从机器上正确解析,检查以确保该域是可解析的 原始问题 我正在编写一个基于节点的程序,在这个程序中,用户可以要求我代表他们做一个httprequest{当然,他们向我提供了一些数据和调用的方法},但每次我做httprequest时,它都会给我一个错误 getaddrinfo eNONT 这就是我的代码的外观Node.js nodejs httprequest带有数据-获取错误getaddrinfo Enoint 更新-自行回答,node.js,httprequest,getaddrinfo,Node.js,Httprequest,Getaddrinfo,我看到一个人必须确保DNS从机器上正确解析,检查以确保该域是可解析的 原始问题 我正在编写一个基于节点的程序,在这个程序中,用户可以要求我代表他们做一个httprequest{当然,他们向我提供了一些数据和调用的方法},但每次我做httprequest时,它都会给我一个错误 getaddrinfo eNONT 这就是我的代码的外观 function makehttprequest(deviceid, httpaction, httppath,methods, actiondata, callba
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…');
}
当主机(作为httpaction传入)前面有一个scheme(所以是“http://”)时,我看到了这种情况。你的主机应该是像“www.google.com”这样的域名,而不是“www.google.com/hello world”或“www.google.com/hello world” 只保留域名
这里有一个例子:我得到了[Error:Getaddrinfo enoint],但就在得到[Error:connectemfile]之后;由于我对数千个客户端进行负载测试,EMFILE错误(根本原因)被掩盖了。解决方案是:增加文件描述符的数量。在这里添加它是为了完整性,以防其他人也有同样的问题。我在调用
server.listen(端口、主机)时遇到这个错误代码>其中主机无法解析回本地计算机
一旦我将其改回本地计算机解析的主机名/域名/ip,这个错误就消失了
由于我试图通过主机名进行开发连接,因此我在我的主机文件中添加了一个具有所需主机名的条目,并确保该条目与传递给server.listen()的主机名相匹配。如果您有一个尾随斜杠,则问题也会发生:
好:“www.google.com”
坏:“www.google.com/”
我今天又犯了一个愚蠢的错误。这是因为端口号是主机名的一部分
// wrong. gets error getaddrinfo ENOENT
var options = {
hostName: 'localhost:1337',
....
}
// correct
var options = {
hostname: 'localhost',
port: 1337,
};
通过使用request
模块而不是http
如果您的所有代码看起来都正常,但仍然出现相同的错误,这就是我的情况,那么解决方案是在我的/etc/resolv.conf
文件中检查名称服务器
我在我的resolv.conf
文件(8.8.8.8)的开头添加了Google的名称服务器,代码再次正常工作,不再出错
值得注意的是,这个错误是在2015年2月4日我运行sudo apt get upgrade
后开始发生的,我的节点js必须已经更新,并且引入了一个bug,它似乎与我拥有的命名服务器不兼容
起初,我通过在命令行上使用wget获取所需的URL来检查是否存在任何DNS问题,我很好地获取了目标URL的内容,因此我认为这实际上不是DNS问题,但确实存在。我也有类似问题,但作为AWS Lambda函数运行,如果有人对Lambda函数有问题,我就是这样解决的
- 给你的Lambda函数一个VPC
- 至少选择2个子网
- 并选择一个安全组
我花了一天的时间才找到这个补丁,希望它能帮助其他人。+1表示“www.google.com”,类似于主机名而不是“”。这解决了我的问题。你是一个了不起的家伙!如果你需要https,你启动服务器的方式会稍有不同。工作起来很有魅力:-)。非常好的捕获。如果您要从请求头中提取主机名(对于代理来说很常见),只需请求.headers['host'].split(':')[0]即可摆脱用于本地开发的端口,请使用127.0.0.1而不是localhost