存储在AWS EB环境变量中的JSON是在没有引号的情况下检索的



我正在运行一个node.js EB容器,并试图将JSON存储在环境变量中。JSON存储正确,但当通过process.env.MYVARIABLE检索时,返回时会去掉所有双引号。

例如,MYVARIABLE看起来像这样:

{ "prop": "value" }

当我通过process.env.MYVARIABLE检索它时,它的值实际上是{ prop: value},这不是有效的JSON。我试图用'\'来转义引号,即{\"prop\":\"value\"},这只会在字符串返回为{ "prop\": "value\" }时添加更奇怪的行为。我也尝试过用单引号包装整个东西,例如'{ "prop": "value" }',但似乎也去掉了这些。

有人知道如何在环境变量中存储JSON吗?

编辑:更多信息,当您设置环境变量时,某些字符似乎被双重转义。例如,如果我用单引号将对象括起来。当我使用sdk获取它时,值变为:

'{ "prop": "value"}'

另外,如果我去掉引号,反斜杠就会转义,所以如果对象看起来像{"url": "http://..."},那么当我通过sdk查询时,结果是{"url": "http:\/\/..."}

它不仅篡改了文本,还重新排列了JSON属性,因此属性的显示顺序与我设置的不同

更新

所以我想说,这似乎是AWS中的一个错误,因为它似乎破坏了提交的值。无论我使用node.js sdk还是web控制台,都会发生这种情况。作为一种变通方法,我在部署期间将json对象上的双引号替换为单引号,然后在应用程序中再次使用。

使用base64编码

一个重要的字符串正在被神奇地自动破坏。我们不知道EB的内部结构,但我们可以猜测它是在解析JSON。所以不要存储JSON,存储base64编码的JSON:

a = `{ "public": { "s3path": "https://d2v4p3rms9rvi3.cloudfront.net" } }`
x = btoa(a) // store this as B_MYVAR
// "eyAicHVibGljIjogeyAiczNwYXRoIjogImh0dHBzOi8vZDJ2NHAzcm1zOXJ2aTMuY2xvdWRmcm9udC5uZXQiIH0gfQ=="

settings = JSON.parse(atob(process.env.B_MYVAR))
settings.public.s3path
// "https://d2v4p3rms9rvi3.cloudfront.net"
// Or even:
process.env.MYVAR = atob(process.env.B_MYVAR)
// Sets MYVAR at runtime, hopefully soon enough for your purposes

由于这是JS,所以有关于UTF8和节点/浏览器支持的注意事项,但我认为atobbtoa是常见的。文档。

最新更新