你如何在node.js的ejs中检查未定义的属性?

时间:2011-09-02 22:46:18

标签: javascript node.js undefined ejs

检查ejs模板中未定义属性的最佳方法是什么?

(我正在使用TJ Holowaychuk的node.js package

示例:

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

我希望这会渲染“foo undefined”。它确实会引发 foo undefined 错误。

我知道这不应该是一个问题,因为这是预期的行为in the tests。有没有一种简单的方法可以避免这种情况?

我找到的唯一解决方案是使用hasOwnProperty方法。

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

这不会引发任何错误。

是否有更好的方法来保持模板清洁?或者为什么会抛出这个错误?

4 个答案:

答案 0 :(得分:57)

测试属性的另一种方法是通过locals对象间接引用它。使用您的示例:

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

答案 1 :(得分:18)

我会使用typeof,就像if (typeof foo == 'undefined')一样。我使用typeof运算符和字符串“undefined”,而有些人可能会与undefined全局变量进行直接比较。我更喜欢这种方法,因为它可以防止某些恐怖分子JS库开发人员更改全局变量的值,从而使代码损坏。

这也可以表示为三元组,由于没有格拉斯,一些人认为“更干净”:

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

答案 2 :(得分:9)

我认为最简单,最干净:

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

答案 3 :(得分:0)

早期版本的EJS仅支持[?, 1-3+2, 3-5+1, 5-1+3, ?] =[?, 0, -1, 7, ?] 但 现在,在最新版本的EJS中,支持locals

三元运算符样本-

res.locals

if-else样本-

<%= (res.locals.foo)?"foo":"" %>