如何从Node.js中的AWS getObject调用返回变量

时间:2016-05-03 17:22:45

标签: javascript node.js amazon-web-services asynchronous

我正在开发一个依赖于来自AWS的getObject响应的Node.js项目。目前,我可以访问我需要的数据并将其存储在变量(header)中,但不知道如何在main函数中使用它。

TileStreamerS3.prototype.Init = function(filepath, index, s3config){
   var retval = false; 
   AWS.config.update({accessKeyId: s3config.access_key, secretAccessKey: s3config.secret_key});
   var blc = new BlockLibraryConfigs(); 
   var awsConfig = blc.awsConfig; 
   AWS.config.update({region: awsConfig.region}); 

   var aws = new AWS.S3(); 
   var params = {
       Bucket: s3config.bucket, 
       Key: s3config.tile_directory + filepath, 
       Range: 'bytes=0-27'
   };



 aws.getObject(params, function(err, data){
       if(err == null){
            var header = bufferpack.unpack('<7I', data.Body);
            return header; 
       }
   }); 
}; 

如何返回header变量?我看到了一个使用JQuery的可能解决方案,但是我在Windows上遇到了让JQuery与Node一起工作的问题。如果有更好的方法,我不想走这条路。

更新:我知道有关从异步函数返回值的问题有很多。我认为绊倒我的是aws.getObject()是一个将另一个函数作为参数的函数。我想从函数中返回header值,该函数是aws.getObject()函数的参数。此外,我无权更改getObject()功能。

1 个答案:

答案 0 :(得分:1)

首先要了解的异步编程是无法实际将结果从回调函数返回到主函数或其他任何地方。 Here's a tutorial on async coding to get you started

至于你目前的情况,我会用Async Waterfall处理它。 Async将强制异步函数在调用下一个函数之前等待它们完成同步行为(前一个函数的输出作为下一个函数的参数)。

以下是一个例子:

TileStreamerS3.prototype.Init = function(filepath, index, s3config, callback) {
// pass a callback function as a parameter

    var retval = false;
    AWS.config.update({
        accessKeyId: s3config.access_key,
        secretAccessKey: s3config.secret_key
    });
    var blc = new BlockLibraryConfigs();
    var awsConfig = blc.awsConfig;
    AWS.config.update({ region: awsConfig.region });

    var aws = new AWS.S3();
    var params = {
        Bucket: s3config.bucket,
        Key: s3config.tile_directory + filepath,
        Range: 'bytes=0-27'
    };

    async.waterfall([function(callback) {

        aws.getObject(params, function(err, data) {
            if (!err) {
                var header = bufferpack.unpack('<7I', data.Body);

                callback(null, header); // using this we are passing the control to the
                // next function in the array
            }
        });

    }, function(header, callback) { // this is the function which will be called 
        // synchronously from aws.getObject's callback

        // use the header value passed from the previous function
        // do the next bit of asynchronous computation

        callback(null, output_if_any); // call the next function or the final callback

    }], callback); // attach the callback function to the async.waterfall

    // due to the async nature of the code, anything written after the waterfall will
    // be executed before the above code! So if you try to set any variable within the 
    // async function's callback and console.log it here, you will get undefined.

};

这里发生的是使用async.waterfall我们可以创建一个函数列表(每个函数可能包含异步函数),并且一个接一个地同步调用。执行完所有函数后,将使用输出callback调用最后的results函数。

现在当您调用函数TileStreamerS3.Init时,您可以这样做:

TileStreamerS3Object.Init(filepath, index, s3config, function(err, results) {

    if (err) {
        // handle the error
    } else {
        // do whatever you want with the results
        // and continue the processing
    }

});