AWS SDK for Node.js v1.4.0での新機能
ページネーションのサポート
いつのまにか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で追加された新機能、ページネーションを使ってみました。 ドキュメントにもあるように、これは実験的なサポートであり、いつなくなるかわからないので注意してください。