使用 mocha 时 getaddrinfo 无法解析主机文件中的地址

Posted

技术标签:

【中文标题】使用 mocha 时 getaddrinfo 无法解析主机文件中的地址【英文标题】:getaddrinfo fails to resolve address in hosts file when using mocha 【发布时间】:2014-04-23 20:20:13 【问题描述】: Node.js 0.10.26 OS X 10.9.2(也在 ubuntu vagrant box 上)

在我系统上的两个不同模块中,当我使用 mocha 运行测试时,我收到此错误:

[Error: getaddrinfo ENOTFOUND] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo'

这通常意味着我试图解析一个不存在的主机。我尝试使用 dtrace 和这个脚本(我发现并稍作修改)来发现问题:

#!/usr/sbin/dtrace -s

#pragma D option quiet

dtrace:::BEGIN

    printf("%-20s  %-12s %s\n", "TIME", "LATENCY(ms)", "HOST");


pid$target::getaddrinfo:entry

    self->host = copyinstr(arg0);
    self->start = timestamp;


pid$target::getaddrinfo:return
/self->start/

    printf("%d", arg1);
    this->delta = (timestamp - self->start) / 1000000;
    printf("%-20Y  %-12d %s\n", walltimestamp, this->delta, self->host);
    self->host = 0;
    self->start = 0;

使用它,我可以看到被我的测试命中的每个主机要么在我的主机文件中,要么是我的主机名。 printf("%d", arg1); 打印出(I think)函数的返回值。不幸的是,我看到的返回值是一个很大的数字,而不是 0-1 like it should be。

所以我的 dtrace 脚本可能有问题,但这并不能解释我更大的问题:

当我的主机文件包含127.0.0.1 data-proxy 时,为什么主机data-proxy 没有解析?为什么这种情况只会在我使用 mocha 运行测试时发生,而不是在我运行我的服务并手动点击它们时发生?

如果您想查看得到错误的相关 node.js 代码,请随时检查 mongodb 并请求,因为我的用法看起来像他们的示例。

【问题讨论】:

看起来可能是您忘记在某处关闭某些文件句柄。签出:github.com/mikeal/request/issues/699 【参考方案1】:

尝试在 int 中投射 arg1

printf("%d\n", (int) arg1);

这是我最近发现的一个问题,它可以解释为什么你会得到非常大的数字。 IIRC,这是因为在内核中 arg0arg12 存储在 uint64_t 中。我不记得在 libdtrace 中实际执行转换的代码路径。

【讨论】:

我试过了,但我仍然得到奇怪的结果。这些 args 的值似乎取决于我打印出的数量:arg0 arg1 arg2 给出的值与 arg0 arg1 不同。您是否知道我可以阅读以了解更多信息? 这是我现在正在尝试的gist【参考方案2】:

arg1 的大数字是由于DTrace's Tail-call Optimization。 可以的话可以查看getaddrinfo源码(如果不行,请使用gdb工具的disassemble命令),你会发现getaddrinfo可能会调用其他函数。

【讨论】:

以上是关于使用 mocha 时 getaddrinfo 无法解析主机文件中的地址的主要内容,如果未能解决你的问题,请参考以下文章

带有 systemd 的 getaddrinfo() API

使用 mocha 运行节点检查器

Nodejs错误:getaddrinfo ENOENT [重复]

使用 mocha 测试时超时 [重复]

使用 Promise 并跳过代码时,Mocha 测试超时,为啥?

无法使用 python 连接到 *.onion 站点(<urlopen 错误 [Errno 11001] getaddrinfo failed>)