Node.js 为什么dns.resolveMx会因“而失败?”;gmail.com“;

Node.js 为什么dns.resolveMx会因“而失败?”;gmail.com“;,node.js,ubuntu,windows-subsystem-for-linux,wsl-2,Node.js,Ubuntu,Windows Subsystem For Linux,Wsl 2,我正在尝试调试这个包,更具体地说,我想了解使用gmail.com主机域时遇到的错误。这个错误只发生在运行在WSL2下的Ubuntu20.04上 让我困惑的是,resolveMx在Windows(gmail)上运行良好,在wsl Ubuntu和Windows(protonmail等其他领域)上也能正常运行 运行nslookup或dig也适用于wsl上的gmail域,因此看起来确实是nodejs下面使用的系统调用行为不一致 在这两个操作系统中,我使用的是相同的nodejs版本:14.15.4 我正在

我正在尝试调试这个包,更具体地说,我想了解使用
gmail.com
主机域时遇到的错误。这个错误只发生在运行在WSL2下的Ubuntu20.04上

让我困惑的是,
resolveMx
在Windows(gmail)上运行良好,在wsl Ubuntu和Windows(protonmail等其他领域)上也能正常运行

运行
nslookup
dig
也适用于wsl上的gmail域,因此看起来确实是nodejs下面使用的系统调用行为不一致

在这两个操作系统中,我使用的是相同的nodejs版本:14.15.4

我正在使用的代码段:

const dns = require('dns');
const util = require('util');


dns.resolveMx('gmail.com', (err, addresses) => {
  if (err){
    console.log(err); // going here, see error message below
    return;
  }
    console.log(util.inspect(addresses));
});
给出以下错误,仅适用于WSL2上托管的Ubuntu:

Error: queryMx ETIMEOUT gmail.com
    at QueryReqWrap.onresolve [as oncomplete] (dns.js:203:19) {
  errno: undefined,
  code: 'ETIMEOUT',
  syscall: 'queryMx',
  hostname: 'gmail.com'
}
在Windows上,我得到了预期的结果:

[
  { exchange: 'alt1.gmail-smtp-in.l.google.com', priority: 10 },
  { exchange: 'gmail-smtp-in.l.google.com', priority: 5 },
  { exchange: 'alt4.gmail-smtp-in.l.google.com', priority: 40 },
  { exchange: 'alt3.gmail-smtp-in.l.google.com', priority: 30 },
  { exchange: 'alt2.gmail-smtp-in.l.google.com', priority: 20 }
]
更让我困惑的是,如果我为另一个提供商(比如protonmail)更改gmail,mx分辨率在wsl发行版和Windows上都能正常工作

更新


这个问题发生的不一致,因为我在wsl上的某个时候也使用了
resolveMx

它在wsl中总是失败还是不一致?你能
strace
it来查看它是否在重复寻找像/etc/resolv.conf这样的名称服务器文件吗?我想不出你失败的原因,但是我安装了NodeJS 14.15.4(使用n)并在WSL2和Ubuntu 20.04下运行了你的代码片段,没有任何问题。我收到的结果与您在Windows节点下收到的结果相同,只是顺序不同。我在想,我们需要看一看特定于你们环境的东西吗?@ZacAnger这确实是不一致的。我没有注意到它,因为到目前为止它总是失败,但在和斯特拉斯玩过之后,我让它工作了一次。这让我更加困惑……我不熟悉strace命令,我应该在输出中寻找一些特别的东西吗?您提到了
/etc/resolv.conf
。在输出中,我确实有以下条目:
openat(AT_FDCWD,“/etc/resolv.conf”,O_RDONLY)=17 fstat(17,{st_mode=S_IFREG | 0644,st_size=198,…})=0 read(17,“#此文件自动被ge”…,4096)=198 read(17,“,4096)=0 close(17)=0
是我将如何解决特定问题的。如果它不断从/etc/resolv.conf或类似文件中读取数据,可能会指向DNS缓存问题,但如果只有一个问题,那么这可能不是问题所在。