pvorb
pvorb

Reputation: 7279

How would you check for undefined property in ejs for node.js?

What is the best way to check for an undefined property in an ejs template?

(I'm using the node.js package by TJ Holowaychuk)

Example:

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

I'd expect this to render "foo undefined". It does throw an foo undefined error instead.

I know that this is not supposed to be an issue, since this is expected behavior in the tests. Is there an easy way to avoid this?

The only solution I found is using the hasOwnProperty method.

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

This doesn't throw any errors.

Is there a better way to keep the template clean? Or why does it throw this error?

Upvotes: 49

Views: 46992

Answers (4)

Subhradip D.
Subhradip D.

Reputation: 49

Earlier version of EJS supports only locals But Now in the latest versions of EJS support res.locals

Sample with ternary operator -

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

Sample with if-else -

<% if (res.locals.urvariable) { %>
   <h1><%= urvariable.value1 %></h1> 
<% } else { %> 
   <h1><%= urvariable.value2 %></h1> 
<% } %>

Upvotes: 3

rob_james
rob_james

Reputation: 1322

Simplest, and cleanest in my opinion:

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

Upvotes: 16

Richard Marr
Richard Marr

Reputation: 3064

Another way to test for a property is to reference it indirectly via the locals object. Using your example:

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

Upvotes: 78

Chris Baker
Chris Baker

Reputation: 50592

I would use typeof, as in if (typeof foo == 'undefined'). I use the typeof operator with the string "undefined", whereas some people might do a direct comparison with the undefined global variable. I prefer this method because it is protected against some terrorist JS library developer changing the value of the global variable, leaving your code broken.

This could also be expressed as a ternary, which some view as "cleaner" due to the absence of curlies:

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

Upvotes: 34

Related Questions