Jest和RANDOMBYTESREQUEST打开句柄

10
我是一位有用的助手,可以进行文本翻译。

我有一个正在使用FeathersJS开发的api项目,使用Jest进行测试。

我的测试套件运行良好。然而,它总是以以下警告信息结束:

Jest has detected the following 2 open handles potentially keeping Jest from exiting:

  ●  RANDOMBYTESREQUEST

      at random (node_modules/bcryptjs/dist/bcrypt.js:70:56)
      at node_modules/bcryptjs/dist/bcrypt.js:84:9
      at node_modules/bcryptjs/dist/bcrypt.js:39:29
      at Object.<anonymous> (node_modules/bcryptjs/dist/bcrypt.js:43:2)


  ●  RANDOMBYTESREQUEST

      at Object.<anonymous>.module.exports (node_modules/nexmo/node_modules/uuid/rng.js:3:10)
      at Object.<anonymous> (node_modules/nexmo/node_modules/uuid/uuid.js:57:18)
      at Object.<anonymous> (node_modules/nexmo/src/JwtGenerator.js:1:1)

这个错误是什么意思,我该如何修复它?
注意:我很乐意添加更多细节,例如代码示例,但我不知道从哪里开始。请在评论中要求更多信息,我会相应地更新帖子。
谢谢

只是让“未来的人们”知道,我在使用testcontainers和ws库时遇到了相同的错误。对于解决方案也毫无头绪。 - FabioCosta
3个回答

11

标记为已接受,因为它似乎确实清除了输出。然而,我在v27中有另一个“打开句柄”警告。也许这是相关的?您可以在此处查看我的另一个问题:https://stackoverflow.com/q/69152644/1731473 - Soullivaneuh

3
发生这种情况是因为 RANDOMBYTESREQUEST(从操作系统请求随机字节的请求)需要很长时间。这些随机字节用于提供加密随机性,并依赖于操作系统随着时间累积各种输入而建立的熵缓冲区。您可以将其视为随机性缓冲区。当进程或机器非常新时,此错误是由池中的随机字节耗尽引起的。
在我的案例中,当测试时uuid库会使熵缓冲区变干。 https://www.npmjs.com/package/uuid#uuidv4options-buffer-offset 解决这个问题其实相当奇怪。如果是你的本地开发机有这个问题,你需要(听起来可能很疯狂)在测试期间移动鼠标指针。这会增加熵输入,使RANDOMBYTESREQUEST不会耗尽随机字节。

2
  • 在测试使用nodemailer的函数时,遇到了类似的问题。
x:   ●  RANDOMBYTESREQUEST
x:       23 |  * [Node-mailer docs](https://nodemailer.com/smtp/oauth2/).
x:       24 |  */
x:     > 25 | const transporter = nodemailer.createTransport(
x:          |                                ^
x:       26 |   {
x:       27 |     host: "smtp.gmail.com",
x:       28 |     port: 465,
x:       at new SMTPConnection (node_modules/nodemailer/lib/smtp-connection/index.js:48:26)
x:       at new SMTPTransport (node_modules/nodemailer/lib/smtp-transport/index.js:51:26)
x:       at Object.<anonymous>.module.exports.createTransport (node_modules/nodemailer/lib/nodemailer.js:49:27)
  • 这是一个服务器端脚本,仅适用于NodeJS,而不是在浏览器中运行。
  • 因此,需要将testEnvironment设置为"node"。默认情况下,它是"jsdom"Jest配置参考
  • 使用"jsdom"时,测试成功运行,但进程无限期地继续。通过切换到"node",警告仍然存在,但进程在几秒钟后成功终止。

注意:

  • 在跟踪堆栈时,它导致了函数crypto.randomBytes。如Paul Hill所指出的上面,原因可能是这个函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接