Ответ 1
Точно так же вы делаете это с помощью чего-либо в js, typeof foo == 'undefined'
, или поскольку "locals" - это имя объекта, содержащего их, вы можете сделать if (locals.foo)
. Это просто raw js: p
На странице gigub EJS есть один и только один простой пример: https://github.com/visionmedia/ejs
Пример
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
Кажется, это проверка существования переменной с именем user, и если она существует, сделайте что-нибудь. Дух, правильно?
Мой вопрос: зачем в мире Node бросать 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" в код сервера, но все дело в том, что я хочу проверить наличие таких переменных во время выполнения, используя ваш каждый день если /else nullcheck type рисунок. Исключение для переменной, которая не существует, кажется мне смешной.
Точно так же вы делаете это с помощью чего-либо в 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
Я сталкивался с той же проблемой, используя node.js с mongoose/express/ejs, когда делал связь между двумя коллекциями вместе с mongoose populate(), в этом случае admins.user_id существовал, но был связан с неутолимым users._id.
Таким образом, не удалось найти причину:
if ( typeof users.user_id.name == 'undefined' ) ...
не удалось выполнить команду "Невозможно прочитать свойство" с именем "null" Затем я заметил, что мне нужно сделать проверку следующим образом:
if ( typeof users.user_id == 'undefined' ) ...
Мне нужно было проверить "контейнер" "имя", поэтому он сработает!
После этого это сработало:
if ( !users.user_id ) ...
Надеюсь, что это поможет.
Попробуйте добавить переменную с locals
Пример: if(locals.user){}
<% if (locals.user) { %>
// Your logic goes here
<% } %>
Что я делаю, просто передаю объект по умолчанию, который я вызываю 'data' = '', и передаю его всем моим шаблонам ejs. Если вам нужно передать реальные данные в шаблон ejs, добавьте их как свойство объекта data.
Таким образом, объект данных всегда определяется, и вы никогда не получите сообщение об ошибке undefined, даже если свойство "данных" существует в вашем шаблоне ejs, но не в вашем экспресс-маршруте node.
Для вашего оператора if
вам нужно использовать typeof
:
<% if (typeof user == 'object' && user) { %>
<% } %>