为什么要将对象中的所有值都转换为 Javascript 中的字符串?

Why to cast all the values in an object to strings in Javascript?

免责声明:我的经验主要是使用静态类型语言进行开发,即使我了解动态类型的工作原理,我也不是很熟悉常见的做法,我也不是我非常了解常用的提示和技巧。

我最近开始在一个项目中工作,我们使用无服务器并使用 javascript 在 AWS 中部署一些 lambda。在深入研究现有代码后,我发现了一个让我有点震惊的常见做法:

当调用 lambda 并接收到 JSON 负载时,会进行初始预处理,将对象中的所有值转换为字符串。

const mapValues = require('lodash/mapValues')
const escape = require('validator/lib/escape')
...
const body = mapValues(requestBody, value => escape('' + value))
...

然后在预处理之后,真正的工作开始(验证、处理、调用其他服务等...)

我的第一个想法是:

问题 1:使用这种方法还有其他好处和缺陷吗?

Q2:这可以被认为是一种不好的做法吗?如果是这样,为什么? (事实,不是意见)

提前致谢! :)

有趣的问题。我建议你问问作者他们是否可用。以下是我的一些想法:

我认为拥有字符串值不会减少反而会增加认知负担,因为您在进行基本算术运算时必须注意转换它们。我相信我们所有人都至少见过一次 1+111.

此外,将每个数据都作为字符串处理是一种非常糟糕的做法,它甚至有自己的模拟名称:stringly typed。这是食谱示例。

我能想到的唯一正当理由是防止针对服务的各种注入攻击。在某些情况下,如果允许用户发送任意 json,则可以使服务执行正常情况下不会执行的代码路径。 (像 {"__proto__":[],"length":1,"0":"foo"} 这样古怪的东西强制转换为 "foo" 但它是 typeof 对象,这可以绕过一些有缺陷的验证逻辑。mongodb 也容易受到类似的攻击)。但即使在这种情况下,正确的验证也比将每个值都转换为字符串要好得多。