我的节点测试随机失败“在建立安全TLS连接之前断开客户端网络套接字的连接”,并且我已经调试了好几个星期。怎么了我正在使用超级测试
答案 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,因此可以使用临时范围之外的固定端口来避免所有这些情况。