在EJS模板(使用ExpressJS)中检查variables的存在的正确方法是什么?

在EJS的github页面上,有一个简单的例子: https : //github.com/visionmedia/ejs

<% if (user) { %> <h2><%= user.name %></h2> <% } %> 

这似乎是检查名为用户的variables的存在,如果它存在,做一些东西。 杜,对不对?

我的问题是,如果用户variables不存在,为什么世界上会抛出一个ReferenceError? 这使得上面的例子没用。 什么是检查variables存在的适当方法? 我希望使用try / catch机制,并抓住ReferenceError?

 ReferenceError: user is not defined at IncomingMessage.anonymous (eval at <anonymous> (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:140:12)) at IncomingMessage.<anonymous> (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:142:15) at Object.render (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:177:13) at ServerResponse.render (/usr/local/lib/node/.npm/express/1.0.7/package/lib/express/view.js:334:22) at Object.<anonymous> (/Users/me/Dropbox/Projects/myproject/server.js:188:9) at param (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:146:21) at pass (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:162:10) at /usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:152:27 at Object.restrict (/Users/me/Dropbox/Projects/myproject/server.js:94:5) at param (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:146:21) 

我明白,我可以通过简单地在我的服务器代码中添加一个“用户”本地variables,使这个错误消失,但是这里的重点是,我想检查这些variables在运行时是否存在使用你的每一天if / else nullchecktypes模式。 一个不存在的variables的例外对我来说似乎很荒谬。

与js中的任何东西一样, typeof foo == 'undefined' ,或者因为“locals”是包含它们的对象的名字,你可以这样做if (locals.foo) 。 这只是原始的js:p

要检查用户是否被定义,你需要这样做:

 <% if (this.user) { %> here, user is defined <% } %> 

你可以创build一个视图助手来检查“obj === void 0”,这个是express.js:

 res.locals.get = function() { var args = Array.prototype.slice.call(arguments, 0); var path = args[0].split('.'); var root = this; for (var i = 0; i < path.length; i++) { if(root[path[i]] === void 0) { return args[1]?args[1]:null; } else { root = root[path[i]]; } }; return root; } 

然后在视图中使用它

 <%- get('deep.nested.non.existent.value') %> //returns: null <%- get('deep.nested.non.existent.value', "default value") %> //returns: default value 

我在使用mongoose / express / ejs时,遇到了同样的问题,在将两个集合与mongoose的populate()进行关联时,使用了node.js,在这种情况下,admins.user_id存在,但与不相关的users._id相关。
所以,找不到原因:

 if ( typeof users.user_id.name == 'undefined' ) ... 

失败了“无法读取null属性的名称”然后我注意到,我需要做这样的检查:

 if ( typeof users.user_id == 'undefined' ) ... 

我需要检查“名称”的“容器”,所以它的工作!
之后,这个工作是一样的:

 if ( !users.user_id ) ... 

希望能帮助到你。

尝试在locals前面加上variables

例如: if(locals.user){}

 <% if (locals.user) { %> // Your logic goes here <% } %> 

我所做的只是传递一个默认的对象,我叫'数据'='',并将其传递给我所有的ejs模板。 如果您需要将真实数据传递给ejs模板,请将它们添加为“数据”对象的属性。

这样,'data'对象总是被定义的,即使'data'的属性存在于你的ejs模板中,但是你的节点的expresspath中也不会存在未定义的错误信息。

对于你的if语句,你需要使用typeof

 <% if (typeof user == 'object' && user) { %> <% } %>