【问题标题】:Unhandled rejection Error: Integer is unsafe未处理的拒绝错误:整数不安全
【发布时间】:2018-01-29 13:12:15
【问题描述】:

通过 socket.io 2.0 发送 JSON 数据时,有时我会收到错误“未处理的拒绝错误:整数不安全”。以下是发送导致此类错误的推文对象的示例。

示例代码: https://gist.github.com/whoisstan/dcba1471094b984514c436fd395364e2

我在节点 6.11.2 上使用这些包:

  • “redis”:“^2.8.0”,
  • “socket.io”:“~2.0”,
  • “socket.io-redis”:“^5.1.0”

JSON 负载是否太大?如果是,如何约束有效载荷?

【问题讨论】:

  • 理解和回答问题所需的代码必须粘贴到您的实际问题中,而不仅仅是通过链接获得。这是因为链接有随时间变化或消失的习惯,使得问题无法作为长期参考。请将代码的相关部分直接添加到您的问题中,然后适当地格式化它们。
  • 这个 JSON 的来源是什么?它来自哪里?
  • 它直接来自 twitter api,这就是为什么我很困惑它不能很好地作为 socketio 有效负载。
  • Twitter 本身解释了我在回答中链接的开发文档中的问题。你在 node.js 中解析这个吗?什么版本?
  • 我是一个从 twitter 中检索数据的人,在它周围放一个信封,然后把它放在 mongodb 中,排队。在该过程中没有编码问题。仅在通过 socket2 发送时。

标签: javascript socket.io socket.io-redis


【解决方案1】:

Javasvcript 中的最大安全整数是:

9007199254740991

您的 JSON 包含以下整数:

899068272867328000

超出限制。

不需要实际用作数字的事物(这些大数字之一被标记为“id”可能只是用作字符串而不是数字,因此将它们作为字符串而不是数字放入 JSON。

如果此数据来自 Twitter,以下是 Twitter 开发文档中对该问题的讨论:Twitter IDs。请注意,JSON 结构提供 id_str 作为替代,它确实是一个字符串。

而且,根据那篇文章,您需要在解析 JSON 之前对其进行预处理以删除 id 值,或者您需要获得一个不会抛出带有这些长 ID 的异常的解析器,而只是截断它们或将它们转换为nullNaN。而且,无论哪种情况,您的代码都需要使用.id_str,而不是.id

【讨论】:

  • 很好的发现和很好的答案。该值是从 twitter API 有效负载中检索的,解析并保存到 mongo 中,排队然后检索以通过套接字发送它,仅在最后一站出现错误。归根结底,我希望避免预先解析和调整我们正在检索的所有数据,而不是破坏编码。
猜你喜欢
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 2017-04-04
  • 2020-06-19
  • 2019-04-09
相关资源
最近更新 更多