Jest 和 RANDOMBYTESREQUEST 打开句柄

Jest and RANDOMBYTESREQUEST open handles

我有一个 FeathersJS api project running 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)

这个错误是什么意思,我该如何解决?

注意:我很乐意添加更多详细信息,例如代码示例,但我真的不知道从哪里开始。不要犹豫,提出更多意见,我会相应地更新 post。

谢谢

这是因为 RANDOMBYTESREQUEST(从 OS 请求随机字节)花费了很长时间。这些随机字节用于提供加密随机性,并依赖于 OS 使用各种输入随时间建立起来的熵缓冲区。您可以将其视为随机缓冲区。此错误是由 运行 池中的随机字节不足引起的,并且似乎在进程或机器非常新时发生。 在我的例子中,是 uuid 库在测试时 运行 干燥了熵缓冲区。 https://www.npmjs.com/package/uuid#uuidv4options-buffer-offset

事实证明这个修复很奇怪。如果是您的本地开发机器出现问题,您(这看起来很疯狂)在测试期间四处移动鼠标指针。这会添加熵输入,因此 RANDOMBYTESREQUEST 不会 运行 超出随机字节。

  • 运行 在测试使用 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 config reference.
  • 对于 "jsdom",测试 运行 成功,但该过程无限期地继续。通过切换到 "node",警告仍然存在,但进程在几秒后成功终止。

注:

  • 沿着堆栈轨迹,它通向函数 crypto.randomBytes。原因可能正如 Paul Hill .
  • 指出的那样

RANDOMBYTESREQUEST 问题是 JEST

初步调查时间:https://github.com/facebook/jest/issues/11275

然后在 PR 中解决了这个问题:https://github.com/facebook/jest/pull/11278

此修复在 JEST 版本 - 27.0.0 中可用。

所以解决方案是将 Jest 版本升级到 27.0.0(最低)