web-dev-qa-db-ja.com

node.jsのejsで未定義のプロパティをどのように確認しますか?

Ejsテンプレートで未定義のプロパティをチェックする最良の方法は何ですか?

(私はTJ Holowaychukによって node.jsパッケージ を使用しています)

例:

var tpl = '<% if (foo) { %>foo defined<% } else { %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz" } }));

私はこれが「foo undefined」になると思います。代わりにfoo undefinedエラーをスローします。

これは予想される動作 テスト内 であるため、これは問題ではないことを知っています。これを回避する簡単な方法はありますか?

私が見つけた唯一の解決策は、hasOwnPropertyメソッドを使用することです。

var tpl = '<% if (hasOwnProperty("foo")) { %>foo defined<% } else { %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz"} }));

これはエラーをスローしません。

テンプレートをきれいに保つより良い方法はありますか?または、なぜこのエラーをスローするのですか?

34
pvorb

プロパティをテストする別の方法は、localsオブジェクトを介して間接的にプロパティを参照することです。あなたの例を使用して:

var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz"} }));
62
Richard Marr

if (typeof foo == 'undefined')のように、typeofを使用します。文字列 "undefined"でtypeof演算子を使用していますが、undefinedグローバル変数と直接比較する人もいます。テロリストのJSライブラリ開発者がグローバル変数の値を変更してコードが壊れたままになるのを防ぐため、私はこの方法を好みます。

これは、カーリーが存在しないため「クリーン」であると考える3項としても表現できます。

var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<% ) %>';
19
Chris Baker

私の考えでは最も単純でクリーンです:

<%= (!!locals.foo)?foo:'' %>

10
rob_james