使用NodeJS SDK以同步方式进行AWS Kinesis putRecords

时间:2019-05-11 22:15:41

标签: javascript node.js amazon-kinesis aws-sdk-nodejs

我正在尝试使用适用于NodeJS的AWS开发工具包将数据写入Amazon Kinesis。我正在使用要与async / await一起使用的putRecords方法。将记录写入Kinesis后,我需要执行一些其他步骤。我希望这是一个同步过程,所以我不能只使用回调。

我尝试了使用promise,async / await的几种不同方法,但是似乎都没有用。

使用异步/等待:

let response = await kinesisPutRecords({ 
    Records: //records,
    StreamName: //streamName
});

async function kinesisPutRecords(recordsParams){

    return new Promise((resolve, reject)=>{

        kinesisClient.putRecords(recordsParams,function (err, data) {
            if (err) 
                reject(err);
            resolve();        
        }
    });
}

承诺

let response = await kinesisClient.putRecords(recordsParams).promise();
console.log(response);

此方法在循环内使用,循环继续进行而无需等待此调用完成。

这两种方法都可以与S3.getObject()一起使用;

感谢您的帮助。谢谢。

更新1:

我发现上面的代码有问题。它只是缺少try ... catch块导致了此问题。在我的完整代码中,我仍然遇到这个问题,但是我能够找到根本原因。

我正在csv tarnsform中使用NodeJS流。在转换函数内部,等待不起作用。可能是因为流异步并且不会暂停?

接近我的情况的代码:

const transformer = transform(function (record) {
    //add records to an array until a threshold is met and then push to kinesis.

let response = await kinesisPutRecords();
console.log(response);

}, function(err, output){
  //logic to push remaining records
});

fileReadStream
   .pipe(gunzip) //unzip the file
   .pipe(csvParser) //to parse the csv
   .pipe(transformer);


async function kinesisPutRecords(recordsParams){

    return new Promise((resolve, reject)=>{
       try{
           kinesisClient.putRecords(recordsParams,function (err, data) {
               if (err) 
                  reject(err);
               resolve();        
           });
       }
       catch(exception ex){
           reject();
       }
    });
}

0 个答案:

没有答案