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