我正在运行node.js EB容器并尝试将JSON存储在环境变量中。 JSON存储正确,但是当通过process.env.MYVARIABLE检索它时,它会被返回并且所有双引号都被剥离。
E.g。 MYVARIABLE看起来像这样:
{ "prop": "value" }
当我通过process.env.MYVARIABLE检索它时,它的值是实际的{ prop: value}
,这不是有效的JSON。我试图用' \'即{\" prop \":\"值\"这只会在字符串返回{\ \"prop\\":\ \"value\\" }
时添加更多奇怪的行为。我也尝试用单引号包装整个内容,例如'{ "prop": "value" }'
,但它似乎也剥夺了这些。
任何人都知道如何在环境变量中存储JSON?
编辑:更多信息,当您设置环境变量时,某些字符会被双重转义。例如。如果我用单引号包装对象。当我使用sdk获取它时的值变为:
\'{ "prop": "value"}\'
此外,如果我将引号保留,反斜杠会被转义,所以如果对象看起来像{"url": "http://..."}
,那么当我通过sdk查询时,结果是{"url": "http:\\/\\/..."}
它不仅会破坏文本,还会重新排列JSON属性,因此属性的显示顺序与我设置的顺序不同。
更新
所以我认为这似乎是AWS中的一个错误,因为它似乎正在破坏提交的值。无论我使用node.js sdk还是Web控制台,都会发生这种情况。作为一种解决方法,我在部署期间用json对象上的单引号替换双引号,然后再在应用程序中再次使用。
答案 0 :(得分:0)
使用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和节点/浏览器支持的警告,但我认为atob
和btoa
很常见。 Docs