AWS SDK for Node.js v1.4.0での新機能

2013.07.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ページネーションのサポート

いつのまにかAWS SDK for Node.jsのv1.4がでていて、何か変わったのかなあと思って少し見てみました。
どうもv1.4ではページネーション機能が実験的に追加されたみたいです。
これは、例えばS3のオブジェクトを取得する際、大量のオブジェクトが取得された場合、一定数毎に順番に取得できるようになるような機能です。
では、この機能を試してみましょう。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.5
  • Node.js : v0.10.8
  • npm : 1.2.23

aws-sdkをインストールしましょう。

% npm install aws-sdk

ページネーションを使用する

S3のオブジェクトを取得し、結果をページ化してみましょう。listObjectsの結果に対してeachPage関数を使用すると、
ページ分だけeachPage関数のコールバック処理を繰り返します。

var AWS = require('aws-sdk');

AWS.config.update({
    "accessKeyId": "アクセスキー",
    "secretAccessKey":"シークレットキー",
    "region": "リージョン" });

var s3 = new AWS.S3();

var pages = 1;
var params = {Bucket: 'バケット名'};
s3.listObjects(params).eachPage(function(err,data) {
   console.log("Page", pages++);
   console.log(data);
});

dataにはlistObjectsで取得できたデータが渡されますが、そのページがない場合にはnullとなります。
また、対象の処理がページ化できるかどうかは、isPageable関数を使うことで判定できます。

//trueになる
s3.listObjects(params).isPageable();

コールバック内でnextPage関数を使用することでも、次のページを取得することができます。
なお、次のページ情報がなければ結果はnullになります。

・
・
s3.listObjects(params, function (err, page1) {
    console.log(page1);
      this.nextPage(function (err, page2) {
       console.log(page2);//ページがなければnull
    });
});

ページネーションとは関係ありませんが、v1.4ではabort機能も追加されています。
下記プログラムを実行すると、s3へputObjectを実行した1秒後に処理が中断されます。

・
・
var request = s3.putObject(params);
request.send(function (err, data) {
  if (err) console.log("Error:", err.code, err.message);
  else console.log(data);
});

//1秒後に中断
setTimeout(request.abort.bind(request), 1000);

まとめ

今回はv1.4で追加された新機能、ページネーションを使ってみました。
ドキュメントにもあるように、これは実験的なサポートであり、いつなくなるかわからないので注意してください。

参考サイトなど