Как правильно проверить наличие переменной в шаблоне 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 84

10 ответов:

так же, как вы сделали бы это с чем-либо в js,typeof foo == 'undefined', или поскольку "locals" - это имя объекта, содержащего их, вы можете сделать if (locals.foo). Это просто raw js: p

попробуйте добавить переменную с locals

пример: if(locals.user){}

чтобы проверить, определен ли пользователь, вам нужно сделать это:

<% 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
<% if (locals.user) { %>

 // Your logic goes here 

<% } %>

я столкнулся с той же проблемой, используя узел.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. Он просто игнорирует его.

теперь, в моем шаблоне (помните, что я передал объект

пришел на эту страницу для ответа, но я придумал более короткий встроенный синтаксис для него, который является:

 <h2><%= user.name ? property.escrow.emailAddress : '' %></h2>