4

簡単な概要は次のとおりです。私の Web アプリでは、CouchApp や CouchDB ビューなどを使用してほとんどの機能を記述できます。レプリケーションを介してコードをサーバーにプッシュする CouchApp の機能が気に入っています。これにより、デプロイ サイクルが非常に簡単になります。

ただし、couchdb でサポートされていない任意の作業を行い、いくつかの制限を回避するには、CouchDB の前に Web プラットフォームを配置する必要があります。JavaScript を使用しているため、これを node.js で構築することを検討しており、コードをデータベースにプッシュする簡単な展開方法を継続したいと考えています。

これがどのように機能するかを想像する方法は次のとおりです。-通常の方法とノードコマンドを使用して、node.jsにWebサーバー/サービスを作成して開始します。- このサービスは、couch db に接続し、仮想リストと URL マッピング リストを取得します。このリストは、すばやく検索できるように redis に保存されます。このリストは、サーバーが要求を受け取ったときに、ホストやパスなどに基づいて、どのハンドラーを実行するかをサーバーに通知します。- サーバーはハンドラーを取得します。これは単なるドキュメントであり、デザイン ドキュメントまたは任意の json ドキュメントである可能性があります。そして、ノード js の一部としてハンドラーを記述したかのように、そのハンドラーを実行して要求を処理します。

問題は、JavaScript 関数をテキスト形式で含む息子のデータ構造を取得し、その関数を実行する方法です。

これは目に見えないほど明白かもしれませんが、私はコンパイルされたバックグラウンドを持っているので、通常、これをほとんど不可能にするコンパイル手順がここにあります。

だから、私が考えているのは疑似コードです: Var string thecode = getValueForMapKey(handlerFunctionIWant); どういうわけか魔法のように(コードを)実行する

上記の魔法の実行ステップを JavaScript で実行する exec または run 関数はありますか?

4

2 に答える 2

11

node.js コンテキストで実行されます。

次のようにノードで動的関数として使用することもできます。

var cradle = require('cradle');
var db = new(cradle.Connection)().database('db_name');

db.get('_design/node%2Fyour_code', function (err, doc) {
  if (!err){
    var your_code = new Function(doc['arguments'].join(','), doc.code);
    your_code("cool", "also cool");
  }else{
    console.error('error:', err);
  }
});

ドキュメントを次のようにします。

{
   "_id": "_design/node/your_code",
   "arguments": [
       "nameOfArg1",
       "nameOfArg2"
   ],
   "code": "console.log('arg1', nameOfArg1); console.log('arg2', nameOfArg2);"
}

これは、新しい関数が呼び出される場所と同じスコープ内にあるため、クレードルにアクセスしたり、そのスコープ内の anon 関数であるかのようにロードされる他のライブラリを要求したりできます。

それを設計ドキュメントに入れて、管理者だけがすぐに変更を加えることができます。

これはより良いですが、同様のアプローチです:

// Format, in db:
doc = {
   "_id": "_design/node",
   "your_function_name": {
       "arguments": [
           "nameOfArg1",
           "nameOfArg2"
       ],
       "code": "console.log('arg1', nameOfArg1); console.log('arg2', nameOfArg2);"
   },
   "your_other_function_name": {
       "arguments": [
           "name"
       ],
       "code": "console.log('hello', name, 'how\\'s it going, bro?');"
   }
};


var cradle = require('cradle');
var db = new(cradle.Connection)().database('db_name');

function run_from_db(name, args){
  db.get('_design/node', function (err, doc) {
    if (!err){
      if (doc[name] !== undefined){
        var fn = new Function(doc[name]['arguments'].join(','), doc[name].code);
        fn.apply(fn, args);
      }else{
        console.error("could not find", name, "in _design/node");
      }
    }else{
      console.error(err);
    }
  });
}


run_from_db('your_other_function_name', ['konsumer']);

これは出力されます:

hello konsumer how's it going, bro?
于 2012-01-31T20:10:42.500 に答える
0

eval(handlerFunctionIwant) は、それを実行するための呼び出しです。もちろん、ハッカーがその文字列にコードを挿入できないようにする必要があります。

node.jsの残りの部分やcouchdbライブラリへのアクセスなど、他のjavascriptリソースにアクセスできるコンテキストでこれが評価されるかどうかは、私には明らかではありません。

于 2010-09-15T20:53:02.853 に答える