Node.js执行顺序

时间:2018-01-04 11:20:53

标签: node.js amazon-s3

我是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文件的这个订阅字段,所以它就在这里。

1 个答案:

答案 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'
});