1

テンプレートエンジンを使用するときに検証するためのベストケースプラクティスはありますか?

私は現在、node.jsとcouchdbを使用してサイトを構築しており、フレームワークとテンプレートエンジンとしてそれぞれejsを使用したexpressを使用しています。HTMLで[Objectobject]またはundefinedが文字通り綴られてしまう可能性があります。validate_doc_update関数を使用してカウチで検証するか、テンプレートにレンダリングする前にルーティング関数内のノードで検証するか、ejsテンプレートで検証を試みることができます。これらのどれか、またはすべてを行う必要がありますか?

4

1 に答える 1

1

テンプレートコンテキストオブジェクトを取得してレンダリングの準備をする関数を作成することをお勧めします。これらは、プレゼンター機能および/またはプレゼンターパターンと呼ばれることもあります。テンプレートをレンダリングする前に、node.jsルーティング関数からこれを使用します。この関数は、null / undefinedを空の文字列に置き換え、toString「[Objectobject]」またはその他の不要なオブジェクトを検出して空の文字列に置き換えることもできます。このための単体テストを作成するのは簡単で、多くのテンプレートでロジックを複製する必要がなくなります。この関数は、オブジェクトグラフ全体またはオブジェクトグラフの配列を再帰的にウォークする必要があります。

また、異常に長い文字列の省略など、他の機能が必要になる場合もあります。たとえば、誰かが誤って大量のゴミをユーザーオブジェクトの「firstName」フィールドに貼り付け、これがたとえば100文字という適切な制限を超えている場合、プレゼンター関数はそれを切り捨てて省略記号を追加する可能性があります。このデータクリーンアップまたは「プレゼンテーション」タイプのロジックのもう1つの例。

それ以外の場合は<%= someObj.someProp || '' %>、ejsテンプレートのような式が必要になり、ボイラープレートコードの重複が多く発生します。

これが最初に機能するjsfiddleの実装です(underscore.jsを使用)。

function sanitize(context) {
    if (Array.isArray(context)) {
      return _.map(context, sanitize);
    }
    _.each(context, function (value, key) {
        if (value === null) {
          context[key] = "";
          return;
        }

        switch (typeof value) {
          case "object":
            context[key] = sanitize(value);
            break;
          case "number":
            //No-op
            break;
          case "boolean":
            //No-op
            break;
          default:
            context[key] = value || ""; //handles undefined
        }                
    });
    return context;
}
于 2012-05-19T18:34:20.420 に答える