На странице Github 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" в код моего сервера, но все дело в том, что я хочу проверять наличие таких переменных во время выполнения, используя ваш каждый день if / else образец типа nullcheck. Мне кажется смешным исключение для несуществующей переменной.
alert
является частью объекта браузераwindow
и недоступен в node.js. Альтернативой являетсяconsole.log
, хотя я не знаю, доступна ли она в шаблоне ejs, если вы не передадите ее черезlocals
.if (locals.user){ }
FTWПопробуйте добавить переменную с помощью
locals
Пример:
if(locals.user){}
источник
источник
Вы можете создать помощник просмотра, который проверяет наличие "obj === void 0", это для express.js:
Затем используйте его в представлении, например
источник
<%=
и<%-
?<%=
HTML сначала экранирует значение;<%-
выводит неэкранированное значение. Таким образом<b>
, при использовании тег будет выделен жирным шрифтом<%-
, а при использовании будет просто текст «<b>»<%=
Чтобы проверить, определен ли пользователь, вам нужно сделать это:
источник
foo
, предложение else все еще оценивается. Протестировано с EJS 2.3.4 EDIT: использованиеlocals
вместоthis
работЯ столкнулся с той же проблемой, используя node.js с mongoose / express / ejs при установлении связи между двумя коллекциями вместе с mongoose populate (), в этом случае admins.user_id существовал, но был связан с несуществующим users._id.
Итак, я не мог понять, почему:
не удалось прочитать свойство 'name', равное нулю. Затем я заметил, что мне нужно выполнить проверку следующим образом:
Мне нужно было проверить "контейнер" имени, так что это сработало!
После этого все работало так же:
Надеюсь, поможет.
источник
Пришел на эту страницу за ответом, но я придумал для него более короткий встроенный синтаксис:
источник
Для
if
выписки вам необходимо использоватьtypeof
:источник
Я просто передаю объект по умолчанию, который я называю 'data' = '', и передаю его всем моим шаблонам ejs. Если вам нужно передать реальные данные в шаблон ejs, добавьте их как свойство объекта data.
Таким образом, объект 'data' всегда определяется, и вы никогда не получите неопределенное сообщение об ошибке, даже если свойство 'data' существует в вашем шаблоне ejs, но не в экспресс-маршруте вашего узла.
источник
У меня была такая же проблема, и, к счастью, я обнаружил, что в JS также есть функция короткого замыкания (я знал, что она есть в Ruby и некоторых других языках).
На стороне моего сервера / контроллера (это из Node.js / Express):
Видишь, что я там делал? Символ &&, который следует после возможно неопределенной переменной (т. Е.
request.session.survey_result
Объекта, который может иметь или не иметь данных формы), является сокращенной нотацией в JS. Он оценивает только ту часть, которая следует за &&, если часть слева от && НЕ определена. Также не выдает ошибку, когда левая часть ЕСТЬundefined
. Он просто игнорирует это.Теперь в моем шаблоне (помните, что я передал объект
req.session.survey_result_survey
объекта в свое представление какsurvey_result
), а затем визуализировал поля как:Я также применил там короткое замыкание, на всякий случай.
Когда я попробовал это с помощью предложенных ранее способов, просто:
Иногда он все равно пытается оценить свойства в операторе IF ... Может быть, кто-то может предложить объяснение, почему?
Кроме того, я хотел исправить это
undefined
без одинарных кавычек, как я видел в предыдущих примерах. Потому что условие никогда не будет оцениваться как значениеtrue
, поскольку вы сравниваете значение String'undefined'
с типом данныхundefined
.источник
Вы можете использовать этот трюк:
где область видимости - родительский объект пользователя
источник
если вы планируете часто использовать один и тот же объект, вы можете использовать такую функцию:
использование:
источник
Я придумал другое решение.
Надеюсь, это поможет.
источник