我的服务器今天抛出了这个,这是一个我以前从未见过的Node.js错误:
Error: getaddrinfo EAI_AGAIN my-store.myshopify.com:443
at Object.exports._errnoException (util.js:870:11)
at errnoException (dns.js:32:15)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:78:26)
我想知道这是否与今天影响Shopify和许多其他服务的DynDns DDOS攻击有关。这里有一篇关于这个的文章。
我的主要问题是dns.js做什么?它属于节点的哪一部分?如何在不同的域上重新创建此错误?
OP错误指定了一个主机(my-store.myshopify.com)。
我遇到的错误在所有方面都是一样的,除了没有指定域。
我的解决方案可能会帮助其他被标题“错误:getaddrinfo EAI_AGAIN”吸引到这里的人
当我试图从一个不同的虚拟机提供一个NodeJs和VueJs应用程序时,我遇到了这个错误。
vue.config.js文件如下:
module.exports = {
devServer: {
host: 'tstvm01',
port: 3030,
},
};
当在原始机器上服务时,启动输出是:
App running at:
- Local: http://tstvm01:3030/
- Network: http://tstvm01:3030/
在虚拟机tstvm07上使用相同的设置让我得到了一个非常类似于OP描述的错误:
INFO Starting development server...
10% building modules 1/1 modules 0 activeevents.js:183
throw er; // Unhandled 'error' event
^
Error: getaddrinfo EAI_AGAIN
at Object._errnoException (util.js:1022:11)
at errnoException (dns.js:55:15)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:92:26)
如果还不明显,将vue.config.js改为…
module.exports = {
devServer: {
host: 'tstvm07',
port: 3030,
},
};
... 解决了问题。
我在码头合成上遇到了问题。原来我忘了把我的自定义隔离命名网络添加到我的服务中,但找不到。
TLDR;确保在compose文件中,在需要相互通信的两个服务上定义了自定义网络。
我的错误是这样的:error: getaddrinfo EAI_AGAIN minio-service。当使用minio-service主机名调用minio-service时,错误来自我的服务器后端。这告诉我minio-service的运行服务,不能被我的服务器的运行服务访问。我能够解决这个问题的方法是我改变了docker-compose中的minio-service:
docker-compose.yml
version: "3.8"
# ...
services:
server:
# ...
networks:
my-network:
# ...
minio-service:
# ... (missing networks: section)
# ...
networks:
my-network:
包括我的自定义隔离命名网络,像这样:
docker-compose.yml
version: "3.8"
# ...
services:
server:
# ...
networks:
my-network:
# ...
minio-service:
# ...
networks:
my-network:
# ...
# ...
networks:
my-network:
关于docker-compose网络的更多细节可以在这里找到。
我得到这个错误后,我最近添加了一个新的网络到我的docker-compose文件。
我最初有这些服务:
services:
frontend:
depends_on:
- backend
ports:
- 3005:3000
backend:
ports:
- 8005:8000
我决定添加一个新的网络,它承载着我想让我的前端服务能够访问的其他服务,所以我这样做了:
networks:
moar:
name: moar-network
attachable: true
services:
frontend:
networks:
- moar
depends_on:
- backend
ports:
- 3005:3000
backend:
ports:
- 8005:8000
不幸的是,上述情况导致我的前端服务在默认网络上不再可见,而只在moar网络中可见。这意味着前端服务不能再代理请求到后端,因此我得到如下错误:
试图代理到:localhost:3005/graphql/时发生错误
解决方案是将默认网络添加到前端服务的网络列表中,如下所示:
networks:
moar:
name: moar-network
attachable: true
services:
frontend:
networks:
- moar
- default # here
depends_on:
- backend
ports:
- 3005:3000
backend:
ports:
- 8005:8000
现在我们好了!
最后一件事,如果您想查看在给定网络中运行的服务,可以使用docker network inspect <network_name>命令。这帮助我发现前端服务不再是默认网络的一部分。
对于那些每天执行数千或数百万个请求,并且需要解决此问题的人:
在服务器上执行大量请求时,得到getaddrinfo EAI_AGAIN错误是很正常的。Node.js本身不执行任何DNS缓存,它委托所有与操作系统相关的DNS。
你需要记住,每个http/https请求都会执行一个DNS查找,这可能会变得相当昂贵,为了避免这个瓶颈和getaddrinfo错误,你可以实现一个DNS缓存。
http。请求(和https)接受一个默认为dns的查找属性。
http.get('http://example.com', { lookup: yourLookupImplementation }, response => {
// do something here with response
});
我强烈建议使用一个已经测试过的模块,而不是自己编写DNS缓存,因为您必须正确处理TTL,以及其他一些事情,以避免难以跟踪错误。
我个人使用缓存查找,这是一个得到使用(见dnsCache选项)。
您可以在特定的请求中使用它
const http = require('http');
const CacheableLookup = require('cacheable-lookup');
const cacheable = new CacheableLookup();
http.get('http://example.com', {lookup: cacheable.lookup}, response => {
// Handle the response here
});
或全球
const http = require('http');
const https = require('https');
const CacheableLookup = require('cacheable-lookup');
const cacheable = new CacheableLookup();
cacheable.install(http.globalAgent);
cacheable.install(https.globalAgent);
注意:请记住,如果一个请求不是通过Node.js的http/https模块执行的,在全局代理上使用.install不会对所述请求产生任何影响,例如使用undici发出的请求