带有“在建立安全TLS连接之前客户端网络套接字已断开连接”的Node + supertest薄片

时间:2020-08-10 15:23:14

标签: node.js ssl port supertest

我的节点测试随机失败“在建立安全TLS连接之前断开客户端网络套接字的连接”,并且我已经调试了好几个星期。怎么了我正在使用超级测试

1 个答案:

答案 0 :(得分:1)

Tldr;不要依靠超级测试来调用监听并关闭服务器。在调用supertest.agent之前先调用server.listen,然后自行处理close。

有用的读物​​:https://gavv.github.io/articles/ephemeral-port-reuse/

net.Server.listen创建的套接字具有添加的SO_REUSEADDR标志。这意味着可以同时绑定多个同一个端口,因为它们都添加了SO_REUSEADDR标志。

默认情况下,Supertest将调用server.listen(0),该服务器使用SO_REUSEADDR在临时端口上创建并ipv6套接字。

稍后当您使用supertest与本地服务器通信时,似乎更喜欢通过ipv4而不是ipv6进行连接。至少在Mac上还可以,因为如果是双堆叠,即绑定到ipv6上的“ ::”也将侦听ipv4上的同一端口(如果其他进程未占用该端口)。

但是,有时可能会有另一个进程在监听测试所使用的临时端口的ipv4版本(SO_REUSEADDR允许此操作)。上面的双重堆叠逻辑将选择ipv4套接字,以对来自测试的ipv6套接字进行随机处理。

有100万个原因导致此操作不起作用,并且外部进程在TLS握手完成之前关闭了它的结尾,随机地给您带来问题中的错误。幸运的是,如果服务器在调用supertest.agent时已经在侦听,则supertest不再试图隐式地调用listen / close,因此可以使用临时范围之外的固定端口来避免所有这些情况。

相关问题