Deno配置受限网络域名连接Redis时出现getaddrinfo ENOTFOUND错误的问题求助
嘿,我来帮你分析下这个问题!你遇到的情况其实是Deno网络权限控制的一个细节问题——当你用--allow-net指定具体的主机:端口规则时,Deno默认会限制域名解析(DNS查询)的请求,这就导致它无法解析redis这个主机名,进而抛出getaddrinfo ENOTFOUND错误。
咱们一步步来解决:
问题根源
Deno的--allow-net权限规则,当你只写redis:6379时,它仅允许向redis主机的6379端口发起TCP连接,但域名解析本身的DNS请求并没有被允许,所以Deno连redis这个主机名对应的IP都查不到,自然无法建立连接。
解决方案
这里有几个实用的解决办法,你可以按需选择:
添加上主机名的权限允许:
把redis主机名单独加入--allow-net的列表里,让Deno允许对这个主机的DNS解析请求,同时保留端口限制:CMD ["run", "--allow-net=redis,redis:6379,[::]:8000", "--allow-env", "--allow-read", "main.ts"]这样Deno就能先正常解析
redis的IP,再建立6379端口的连接了,这也是最推荐的方案。直接使用Redis容器的IP(不推荐,灵活性差):
如果你的docker-compose里给Redis容器分配了固定IP,也可以直接用IP代替主机名,比如假设Redis的IP是172.18.0.3,那么启动命令改成:CMD ["run", "--allow-net=172.18.0.3:6379,[::]:8000", "--allow-env", "--allow-read", "main.ts"]不过这种方式的缺点是容器重启后IP可能变化,后续维护起来比较麻烦。
升级Deno到最新稳定版:
有些旧版本的Deno在--allow-net的权限逻辑上存在bug,对域名解析的处理不够完善。升级到最新版本后,这类权限相关的小问题可能已经被官方修复了。
你可以先试试第一种方法,应该能快速解决你的问题!
备注:内容来源于stack exchange,提问作者user3331142

