はじめに
ブロックチェーン・ベースのオブジェクトストレージを作ってみましたが、オブジェクトやコンテナ一覧を取得すると余計な文字列が付いていました。
testuser
というアカウントのcontainer0
というコンテナの下にobj0
とobj1
というオブジェクトを作成し、その一覧を取得するコマンドを投げる場合、本来であればオブジェクト名の一覧だけ返ってきて欲しいところですが、現状では下の例のように余計な文字列もくっついて返ってきます。
$ curl -X GET http://localhost:3000/testuser/container0
Resource {id=org.acme.objectstore.Object#testuser/container0/obj0},Resource {id=org.acme.objectstore.Object#testuser/container0/obj1}
これは、Hyperledger Composerのクエリが返すオブジェクトを文字列に変換して表示しているためです。今回、オブジェクトやコンテナ一覧の表示方法を改良してみました。
改善方法
下のコードのように、query()
メソッドの戻り値results[]
をループで回してオブジェクト名を取得して返すようにしました。
router.get('/:accountid/:containerid', function(req, res, next){
console.log("listing objects for " + req.params.accountid + " in " + req.params.containerid);
var selectStatement = businessNetworkConnection.buildQuery('SELECT org.acme.objectstore.Object WHERE (container == _$class)');
var accountContainerId = req.params.accountid + "/" + req.params.containerid;
businessNetworkConnection.query(selectStatement, { "class": "resource:org.acme.objectstore.Container#" + accountContainerId })
.then(function(results) {
let objects = "";
for(let i=0; i<results.length; i++){
objects += results[i].objectId;
objects += ",";
}
res.send(objects);
}).catch(function (error){
res.send(error);
});
});
上記のコードはオブジェクト一覧を返すメソッドですが、コンテナ一覧を返すメソッドにも同様の変更を加えています。では、早速コードをテストしてみましょう。
$ curl -X GET http://localhost:3000/testuser/container0
obj0,obj1,
余計な文字列を排除し、以前よりも見栄えを良くすることができました!コードはこちらに置いています。
おわりに
将来的にはJSONやXMLの形式でオブジェクト一覧を表示したいです。