Na página do github EJS, há um e apenas um exemplo simples: https://github.com/visionmedia/ejs
Exemplo
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
Isso parece estar verificando a existência de uma variável chamada user e, se ela existir, faça algumas coisas. Duh, certo?
Minha pergunta é: por que o Node lançaria um ReferenceError se a variável de usuário não existe? Isso torna o exemplo acima inútil. Qual é a maneira apropriada de verificar a existência de uma variável? Devo usar um mecanismo try / catch e capturar esse 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)
Eu entendo que eu poderia fazer esse erro desaparecer simplesmente adicionando uma variável local de "usuário" no meu código de servidor, mas o ponto principal aqui é que eu quero verificar a existência de tais variáveis em tempo de execução usando seu every day if / else padrão de tipo nullcheck. Uma exceção para uma variável que não existe parece ridícula para mim.
alert
é parte dowindow
objeto de um navegador e não está disponível em node.js. A alternativa éconsole.log
, embora eu não saiba se ele está disponível em um modelo ejs, a menos que você passe porlocals
.if (locals.user){ }
FTWTente prefixar a variável com
locals
Exemplo:
if(locals.user){}
fonte
fonte
Você pode criar um assistente de visualização que verifica "obj === void 0", este é para express.js:
Em seguida, use-o na vista como
fonte
<%=
e<%-
?<%=
HTML escapa o valor primeiro;<%-
produz o valor sem escape. Então<b>
se tornaria uma tag em negrito ao usar<%-
, mas simplesmente o texto "<b>" ao usar<%=
Para verificar se o usuário está definido, você precisa fazer isso:
fonte
foo
, a cláusula else ainda é avaliada. Testado com EJS 2.3.4 EDIT: usandolocals
no local dethis
trabalhoEu encontrei o mesmo problema usando node.js com mongoose / express / ejs ao fazer uma relação entre 2 coleções junto com populate () do mongoose, neste caso admins.user_id existia, mas estava relacionado a um users._id inexistente.
Então, não consegui descobrir o porquê:
estava falhando com "Não é possível ler a propriedade 'nome' de nulo" Então percebi que precisava fazer a verificação assim:
Eu precisava verificar o "container" de 'name', então funcionou!
Depois disso, funcionou da mesma forma:
Espero que ajude.
fonte
Vim a esta página para obter uma resposta, mas descobri uma sintaxe in-line mais curta para ela, que é:
fonte
Para sua
if
declaração, você precisa usartypeof
:fonte
O que eu faço é apenas passar um objeto padrão que chamo de 'dados' = '' e passá-lo para todos os meus modelos ejs. Se você precisar passar dados reais para o template ejs, adicione-os como propriedade do objeto 'data'.
Desta forma, o objeto 'data' é sempre definido e você nunca obtém mensagem de erro indefinida, mesmo que a propriedade 'data' exista em seu modelo ejs, mas não em sua rota expressa de nó.
fonte
Eu tive o mesmo problema e, felizmente, descobri que também há uma função de curto-circuito em JS (eu sabia que havia uma em Ruby e algumas outras linguagens).
No meu servidor / controlador (isso é do Node.js / Express):
Veja o que eu fiz lá? O && que segue após uma variável possivelmente indefinida (ou seja
request.session.survey_result
, objeto, que pode ou não ter dados de formulário) é a notação de curto-circuito em JS. O que ele faz é apenas avaliar a parte que segue o && se a parte à esquerda do && NÃO for indefinida. Ele também não lança um erro quando a parte esquerda ESTÁundefined
. Ele simplesmente o ignora.Agora, em meu modelo (lembre-se de que passei o objeto
req.session.survey_result_survey
objeto para minha visualização comosurvey_result
) e renderizei os campos como:Eu usei curto-circuito lá também, apenas por segurança.
Quando experimentei com as formas sugeridas anteriormente, apenas:
Às vezes, ele ainda tentaria avaliar as propriedades dentro da instrução IF ... Talvez alguém possa oferecer uma explicação do porquê?
Além disso, queria corrigir que
undefined
precisa ser sem as aspas simples, como vi feito em exemplos anteriores. Porque a condição nunca será avaliadatrue
como, pois você está comparando um valor String'undefined'
com um tipo de dadosundefined
.fonte
Você pode usar este truque:
onde o escopo é o objeto pai do usuário
fonte
se você planeja usar o mesmo objeto com frequência, pode usar uma função como esta:
uso:
fonte
Eu encontrei outra solução.
Eu espero que isso ajude.
fonte