Как правильно проверить наличие переменной в шаблоне EJS (используя ExpressJS)?
на странице EJS github есть один и только один простой пример: https://github.com/visionmedia/ejs
пример
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
это похоже на проверку существования переменной с именем user, и если она существует, сделайте некоторые вещи. Да, верно?
мой вопрос в том, почему в мире узел бросает ReferenceError, если пользовательская переменная не существует? Это делает приведенный выше пример бесполезным. Как правильно проверить за существование переменной? Я должен использовать механизм 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)
Я понимаю, что я мог бы сделать эту ошибку, просто добавив локальную переменную "user" в мой серверный код, но все дело в том, что я хочу проверить наличие таких переменных во время выполнения, используя ваш шаблон типа every day if/else nullcheck. Исключение для переменной, которая не существует, кажется мне смехотворным.
10 ответов:
так же, как вы сделали бы это с чем-либо в js,
typeof foo == 'undefined'
, или поскольку "locals" - это имя объекта, содержащего их, вы можете сделатьif (locals.foo)
. Это просто raw js: p
чтобы проверить, определен ли пользователь, вам нужно сделать это:
<% if (this.user) { %> here, user is defined <% } %>
вы можете создать вид помощника, который проверяет "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
я столкнулся с той же проблемой, используя узел.js с Мангустом / express/ejs при создании связи между 2 коллекциями вместе с Мангустом populate (), в этом случае admins.user_id существовал, но был связан с несуществующими пользователями._идентификатор.
Итак, не мог найти почему:if ( typeof users.user_id.name == 'undefined' ) ...
был сбой с "не удается прочитать свойство' имя ' null" Затем я заметил, что мне нужно было сделать проверку следующим образом:
if ( typeof users.user_id == 'undefined' ) ...
мне нужно было проверить "контейнер ""имя", так что это сработало!
После этого это сработало так же:if ( !users.user_id ) ...
надеюсь, что это помогает.
для
if
заявление, которое вы должны использоватьtypeof
:<% if (typeof user == 'object' && user) { %> <% } %>
Я просто передаю объект по умолчанию, который я называю 'data' = " и передаю его во все мои шаблоны ejs. Если вам нужно передать реальные данные в шаблон ejs, добавьте их как свойство объекта "данные".
таким образом, объект "данные" всегда определен, и вы никогда не получите неопределенное сообщение об ошибке, даже если свойство "данные" существует в вашем шаблоне ejs, но не в вашем узле экспресс-маршрута.
у меня была такая же проблема, и, к счастью, я обнаружил, что в JS также есть функция короткого замыкания (я знал, что она есть в Ruby и некоторых других языках).
на моей стороне сервера / контроллера (это от узла.js / Express):
return res.render('result', {survey_result : req.session.survey_result&&req.session.survey_result.survey });
видишь, что я там сделал? & & , Который следует за возможно неопределенной переменной (т. е.
request.session.survey_result
объект, который может или не может иметь данные формы) является обозначением короткого замыкания в JS. То, что он делает, это только оценить часть, которая следует && , если часть слева от && не является неопределенной. Он также не выдает ошибку, когда левая частьundefined
. Он просто игнорирует его.теперь, в моем шаблоне (помните, что я передал объект