1

couchdbでは、Javascriptでmapおよびreduce関数を定義し、それらをHTTPPOSTを介してサーバーに送信してビューを定義できます。涼しい。

アプリは、それぞれの関数の文字列表現を指定します。

テキストエディタであるemacsを使用して、couchdbに接続するJSアプリを構築しています。これにより、マップを定義し、次のような関数を減らすことができます。

var byname = function(doc) { 
   emit(doc.name,null);
};

これにより、emacs構文の強調表示、jslintチェックなどが可能になります。

実行時に、次のようにして、そのように定義された一連のビュー関数のそれぞれの文字列表現を取得して、CouchDBに送信できます。

doc = { views: { empty:   { map:stringRep(empty) },
                 byname:  { map:stringRep(byname) },
                 invalid: { map:stringRep(invalid) }}};

// PUT that doc to couchdb here, to define the design_doc . 

ただし、文字列表現には、改行、キャリッジリターンなどが含まれます。

単純なケースで機能する正規表現の置換でそれらを除外することができます。ただし、関数内のコメント行のより複雑なケースもあります。例えば:

var byname = function(doc) { 
   // a comment here
   emit(doc.name,null);
};

この場合、stringRepにはコメントが含まれますが、改行とダミーの空白を削除すると、コメントは残ります。私もそれらを交換することができますが、他の問題があるかもしれません(確かではありません)。

人々がcouchdbに送信する前にjavascript関数をサニタイズする典型的または推奨される方法はありますか?

4

3 に答える 3

1

いいえ、特別なことは何もありません。これらは通常のJavaScriptエンジン(SpiderMonkey)によって解釈/コンパイルされ、前処理やクリーンアップなどは必要ありません。他のスクリプトと同じように記述します。

Webで使用されるほとんどのプラクティスは、まったく同じ意味または効果を持っています。何とかして何千もの異なる関数をDBに送信し、帯域幅を節約したい場合は、送信するすべてのものを最小化できます。他の言語からJSなどにコードをコンパイルできます。

于 2012-06-29T08:21:26.590 に答える
0

これは私が使用することになったものです:

CouchDB.stringRep = function(fn) {
    return fn.toString()
        .replace(/[\s\t]*\/\/.*$/gm, '') // comments
        .replace(/\n */gm, ' ')
        .replace(/\r */gm, ' ')
        .replace(/\{ +/gm, '{')
        .replace(/ +\}/gm, '}');
};

次に、このようにシリアル化された関数を、この種のHTTPメッセージとともにアップロードします。

PUT https://foo.cloudant.com/fop/_design/baseViews HTTP/1.1
Accept: text/plain,application/json
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)
Content-Length: ...
Host: foo.cloudant.com

{"views":{"empty":{"map":"function(doc) {if ( ! doc.observation || doc.observation === '') {emit(doc.id, 1);}}"},...}} 
于 2012-06-29T07:59:35.767 に答える
0

いいえ。

私たちはそれらをきれいにするだけでなく、cakeそれらをJSに自動変換するタスクによって挿入されるデザインファイルのcofeescriptにそれらを持っています。

于 2012-06-28T19:56:39.643 に答える