免责声明:我的经验主要是使用静态类型语言进行开发,即使我了解动态类型的工作原理,我也不是很熟悉常见的做法,我也不是很了解通常的提示和技巧呢。
我最近开始在一个项目中工作,我们使用无服务器并使用 javascript 在 AWS 中部署一些 lambda。在深入研究现有代码后,我发现了一个让我有点震惊的常见做法:
当调用 lambda 并接收 JSON 负载时,会进行初始预处理,将对象中的所有值转换为字符串。
const mapValues = require('lodash/mapValues')
const escape = require('validator/lib/escape')
...
const body = mapValues(requestBody, value => escape('' + value))
...
然后在预处理之后,真正的工作开始(验证、处理、调用其他服务等...)
我的第一个想法是:
好处:有助于减少可能的不同类型的认知负担,使我们能够假设一切都将始终是一个字符串。
缺点:处理非字符串值(例如数字)的额外复杂性。
问题 1:使用这种方法还有其他好处和缺陷吗?
问题 2:这可以被视为不好的做法吗?如果是这样,为什么? (事实,不是意见)
提前致谢! :)
最佳答案
有趣的问题。我建议你问问作者他们是否可用。以下是我的一些想法:
我认为拥有字符串值不会减少反而会增加认知负担,因为您在进行基本算术运算时必须注意转换它们。我相信我们所有人都至少见过一次 1+1
是 11
。
此外,将每个数据都作为字符串处理是一种非常糟糕的做法,它甚至有自己的模拟名称:stringly typed。这是食谱示例。
我能想到的唯一正当理由是防止针对服务的各种注入(inject)攻击。在某些情况下,如果允许用户发送任意 json,则有可能使服务执行正常情况下不会执行的代码路径。 (像 {"__proto__":[],"length":1,"0":"foo"}
这样古怪的东西强制转换为 "foo"
但它是 typeof 对象,这可以绕过一些有缺陷的验证逻辑。mongodb 也容易受到一些类似的攻击)。但即使在这种情况下,正确的验证也比将每个值都转换为字符串要好得多。
关于javascript - 为什么要将对象中的所有值转换为 Javascript 中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50011877/