我是Node.js的新手,我正在尝试加载存储在Amazon s3或本地存储库中的json配置文件。以下是我目前的代码:
var cfg = process.env.CONFIG_FILE_NAME;
log.info("Loading config '%s'", cfg);
if(cfg.indexOf("s3") !== -1 || cfg.indexOf("S3") !== -1) {
log.info("S3 path detected");
var s3 = new aws.S3();
var myRegex = /\/\/(\w*)\/(.*)/g;
var matched = myRegex.exec(cfg);
var bucket = matched[1];
log.info("Extracted bucket: ", bucket);
var key = matched[2];
log.info("Extracted key: ", key);
var params = {
Bucket: bucket,
Key: key
};
s3.getObject(params, function(err, data) {
if (err) log.warn(err, err.stack);
else {
log.info("Loaded config from S3");
cfg = JSON.parse(data.Body);
log.info("Config content: "cfg);
}
});
}
else {
try {
//some code here
} catch (e) {
//some code here
}
}
subscriptions = cfg.subscriptions;
log.info("This supposes to contain json content from S3: ", cfg);
这个想法是代码将检查发送到Amazon Lambda(CONFIG_FILE_NAME字段)的消息中是否存在S3的路径。如果存在,则代码从s3加载配置文件,否则,它在本地加载。但是,当我尝试运行代码时,它会返回如下内容:
1月4日11:37:34 - [INFO]加载配置'Path-to-S3'
1月1日11:37:34 - [INFO]检测到S3路径
1月4日11:37:34 - [INFO]提取的桶:mybucket
1月4日11:37:34 - [INFO]提取的密钥:mykey.cfg.json
1月4日11:37:34 - [INFO]“这假设包含来自S3的路径中的json内容:路径到S3'
1月1日11:37:34 - [INFO]从S3加载配置
4 Jan 11:37:34 - [INFO]配置内容:my-config-content
所以问题在于,代码在从S3加载配置文件之前执行行subscriptions = cfg.subscriptions;
。此行的变量cfg仅包含配置的路径,而不是我想从S3加载的配置内容。我以后的代码实现依赖于来自cfg文件的这个订阅字段,所以它就在这里。
答案 0 :(得分:0)
您可以使用异步模块来使代码正常工作。 (npm install --save async)
Async是一个实用程序模块,它提供了直接,强大的函数来处理异步JavaScript。
var async = require("async");
//or you can just use var waterfall = require("async/waterfall");
var cfg = process.env.CONFIG_FILE_NAME;
log.info("Loading config '%s'", cfg);
async.waterfall([
function (callback) {
if (cfg.indexOf("s3") !== -1 || cfg.indexOf("S3") !== -1) {
log.info("S3 path detected");
var s3 = new aws.S3();
var myRegex = /\/\/(\w*)\/(.*)/g;
var matched = myRegex.exec(cfg);
var bucket = matched[1];
log.info("Extracted bucket: ", bucket);
var key = matched[2];
log.info("Extracted key: ", key);
var params = {
Bucket: bucket,
Key : key
};
s3.getObject(params, function (err, data) {
if (err) {
log.warn(err, err.stack);
callback();
}
else {
log.info("Loaded config from S3");
cfg = JSON.parse(data.Body);
log.info("Config content: ", cfg);
callback(null, cfg);
}
});
}
else {
callback();
}
},
function (cfg, callback) {
try {
//some code here
}
catch (e) {
//some code here
}
var subscriptions = cfg.subscriptions;
log.info("This supposes to contain json content from S3: ", cfg);
callback(null, 'done');
}
], function (err, result) {
// result now equals 'done'
});