【问题标题】:Cannot create a string longer than 0x3fffffe7 characters无法创建长度超过 0x3ffffffe7 个字符的字符串
【发布时间】:2021-06-20 15:58:08
【问题描述】:

我正在使用请求库(已启用 gzip),但由于此错误而崩溃。

这个错误似乎发生在这一行,

response.body = response.body.toString(self.encoding)

包含该行的范围,

response.body = Buffer.concat(buffers, bufferLength)
if (self.encoding !== null) {
 response.body = response.body.toString(self.encoding)
}

完整的堆栈跟踪,

Error: Cannot create a string longer than 0x3fffffe7 characters
    at Buffer.utf8Slice (<anonymous>)
    at Buffer.toString (buffer.js:797:17)
    at Request.<anonymous> (/home/proj/node_modules/request/request.js:1128:39)
    at Request.emit (events.js:315:20)
    at IncomingMessage.<anonymous> (/home/proj/node_modules/request/request.js:1076:12)
    at Object.onceWrapper (events.js:421:28)
    at IncomingMessage.emit (events.js:327:22)
    at endReadableNT (_stream_readable.js:1220:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  code: 'ERR_STRING_TOO_LONG'
}

当缓冲区长度超过 1073741799 个字符时,将缓冲区转换为字符串的最佳方法是什么?

【问题讨论】:

  • 这在托尔斯泰的战争与和平长度范围内。我们到底在说什么?你为什么要创建一个 1~2 MB 的字符串?
  • Javascript 无法真正处理这种大小的字符串。实际上,错误再清楚不过了。这不是工作的工具。
  • @JaredSmith 我不知道,但请求库可以。我获取您知道的网站,该大小很常见,但无法前进。
  • @somethinghere 这是 NodeJS。它应该能够处理这种大小的字符串。
  • 但我也愿意跳过这个字符串。我只是不知道该怎么做才能跳过它。

标签: javascript


【解决方案1】:

我在抓取网站时似乎遇到了crawling trap。请求获取的页面大小几乎超过 2GB。

NodeJS 的 Buffer.toString 有 1 GB 的限制,而这个内容已经超出了这个范围。

请求库的作者忘记在 toString 操作中放置一个 catch 块。

解决方法是在 request.js 文件的第 1130 行添加如下所示的 catch 块,

  if (self.encoding !== null) {
    try {
      response.body = response.body.toString(self.encoding)
    } catch(e) {
      self.emit('error', e)
    }
  }

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2020-10-21
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2020-11-05
    相关资源
    最近更新 更多