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

pvo*_*orb 30 javascript undefined ejs node.js

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

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

例:

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

我希望这会渲染"foo undefined".它确实会抛出一个未定义的错误.

我知道这不应该是一个问题,因为这是测试中的预期行为.有一种简单的方法可以避免这种情况吗?

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

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

这不会引发任何错误.

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

Ric*_*arr 60

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

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

  • 正是我需要的,但wtf,你为什么要这样做?!:) (9认同)

Chr*_*ker 18

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

这也可以表示为三元组,有些人认为由于没有条件而"更清洁":

var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<% ) %>';
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,也许这是正式的正确的.但我个人不喜欢它,因为它对我的模板来说太长了. (2认同)

rob*_*mes 9

我认为最简单,最干净:

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

  • locals似乎已在以后的ejs版本中移动到res对象. (3认同)