tmytのらくがき

個人の日記レベルです

nodejsでC#のDynamicObjectみたいなんやってみた

nodejsでC#のDynamicObjectみたいなんやってみた。

v8に、SetNamedPropertyHandlerって関数があって、Objectに対する名前付きプロパティを読み書きするときとかに任意の関数を呼び出してくれるいい感じな機能があるらしい。じゃぁプロパティ読み書きしたら裏の別なDBたたけるね、ってことで作ってみたのがこれ。

var Dynamic = require('dynamic');
var obj = new Dynamic({
    get: function(name){
        return 100;
    }
});
console.log(obj.hoge); // 100
console.log(obj.fuga); // 100
console.log(obj.piyo); // 100

どのプロパティ読んでも必ず100が帰ってくるObject。なんでこれをしようと思ったかというと、オブジェクトのプロパティ読み書きしたらいい感じに裏側のRedisにつながってるとおもしろそうだったから。

実際にためしてみようということでこういうのを用意。

var Dynamic = require('dynamic');
var deasync = require('deasync');
var Redis = function(client_, async_){
  var inner = {
    client: client_.
    get: function(n){
      if(async_) return function(f){ this.client.get(n, f); };
      var ret, got;
      this.client.get(n, function(e,r){
        ret = r;
        got = true;
      });
      deasync.loopWhile(function(){ return !got; });
      return ret;
    },
    set: function(n, v){
      this.client.set(n, v);
    },
    close: function(){
      this.client.quit();
    }
  };
  return new Dynamic(inner);
};

module.exports = Redis;

こんなかんじで使ってみました。

var RedisWrapper = require('redis-wrapper');
var redis = require('redis');
var client = new RedisWrapper(redis.createClient());
client.a = "Hello, world!";
client.b = 3;
console.log(client.a); // Hello, world!
console.log(client.b * 2); // 6
client.close();

まとめ

こういうライブラリ見つけられなかったのですが、たぶんすでにあるはずなので誰か教えてください