Как использовать тернарный оператор в EJS - PullRequest
1 голос
/ 06 августа 2020
<%- user ?  '<h1>Hello  user.name  </h1>' : '<h1>Hello Guest</h1>'  %>

user.name - это переменная, но когда я загружаю страницу, она будет показывать user.name вместо значения, которое содержит user.name.

Ответы [ 4 ]

3 голосов
/ 06 августа 2020

У вас две ошибки:

  1. Вы используете <%=, что не исключает html, что может привести к xss.
  2. Фактически вы не встраиваете переменная user.name в ваших строках, это просто текст.

Поскольку ненужное неэкранированное HTML может привести к XSS, лучший способ - переместить h1 из строки и используйте строки шаблона для вставки имени:

<h1><%= user ? `Hello ${user.name}` : 'Hello Guest' %></h1>
2 голосов
/ 06 августа 2020

Почти точно. Подстановка тройного левого результата "if" для использования конкатенации для user.name должна помочь, поэтому он будет читать это как значение c динамического *, а не как обычный текст.

Вы также можете проверить чтобы убедиться, что свойство name существует у пользователя и имеет непустое значение без пробелов.

Попробуйте следующее:

<%- user?.name && user.name.trim().length ? '<h1>Hello ' + user.name.trim() + '</h1>' : '<h1>Hello Guest</h1>' %>

Вы также можете использовать шаблонные литералы, если хотите это для конкатенации:

<%- user?.name && user.name.trim().length ? `<h1>Hello ${user.name.trim()}</h1>` : '<h1>Hello Guest</h1>' %>

Несколько примечаний:

  • ?. называется дополнительной цепочкой, что позволяет вам проверить, существует ли свойство в пределах объектная переменная, предотвращая срабатывание любой ошибки, если объект не существует.

  • Я использую .trim() здесь, чтобы гарантировать, что значение не только не пустое, но и что он содержит непробельные символы, путем удаления всех начальных и конечных пробелов из строки, если она существует, а затем проверки, чтобы убедиться, что длина строки все еще больше нуля, используя .length. Нам не нужно проверять .length > 0, поскольку 0 уже является ложным значением. Если условия оцениваются как истинные, мы также выводим усеченное значение в левом результате троичного.

Возможно, лучше всего, вы можете переместить некоторые из HTML за пределы оператор JS, чтобы код был как можно более кратким:

<h1>Hello <%- user?.name?.trim()?.length ? user.name.trim() : 'Guest' %></h1>
1 голос
/ 06 августа 2020
<%= user ?  ('<h1>Hello ' + user.name + '</h1>') : '<h1>Hello Guest</h1>'  %>
0 голосов
/ 06 августа 2020

У вас может быть пустой объект пользователя или пустая пользовательская переменная, поэтому используйте ниже

<h1>Hello <%- user && user.name ? user.name : 'Guest' %></h1>
...