存储在AWS EB环境变量中的JSON不带引号检索

时间:2014-10-24 17:56:41

标签: node.js amazon-web-services elastic-beanstalk

我正在运行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对象上的单引号替换双引号,然后再在应用程序中再次使用。

1 个答案:

答案 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和节点/浏览器支持的警告,但我认为atobbtoa很常见。 Docs