En la página de github de EJS, hay un solo ejemplo simple: https://github.com/visionmedia/ejs
Ejemplo
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
Esto parece estar verificando la existencia de una variable llamada usuario, y si existe, haga algunas cosas. Duh, ¿verdad?
Mi pregunta es, ¿por qué en el mundo Node lanzaría un ReferenceError si la variable de usuario no existe? Esto hace que el ejemplo anterior sea inútil. ¿Cuál es la forma adecuada de comprobar la existencia de una variable? ¿Se espera que use un mecanismo de prueba / captura y agarre ese 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)
Entiendo que podría hacer desaparecer este error simplemente agregando una variable local de "usuario" en el código de mi servidor, pero el punto aquí es que quiero verificar la existencia de tales variables en tiempo de ejecución usando su if / else todos los días patrón de tipo nullcheck. Una excepción para una variable que no existe me parece ridícula.
alert
es parte delwindow
objeto de un navegador y no está disponible en node.js. La alternativa esconsole.log
, aunque no sé si está disponible en una plantilla ejs a menos que la pase a través delocals
.if (locals.user){ }
FTWIntente anteponer la variable con
locals
Ejemplo:
if(locals.user){}
fuente
fuente
Puede crear un asistente de vista que busque "obj === void 0", este es para express.js:
Luego úsalo en la vista como
fuente
<%=
y<%-
?<%=
HTML escapa el valor primero;<%-
emite el valor no escapado. Entonces<b>
se convertiría en una etiqueta en negrita cuando se usa<%-
, pero simplemente el texto "<b>" cuando se usa<%=
Para verificar si el usuario está definido, debe hacer eso:
fuente
foo
, la cláusula else todavía se evalúa. Probado con EJS 2.3.4 EDIT: usolocals
en lugar dethis
trabajosMe encontré con el mismo problema al usar node.js con mongoose / express / ejs al establecer una relación entre 2 colecciones junto con mongoose's populate (), en este caso existía admins.user_id pero estaba relacionado con un users._id inexistente.
Entonces, no pude encontrar por qué:
estaba fallando con "No se puede leer la propiedad 'nombre' de nulo" Entonces noté que necesitaba hacer la verificación de esta manera:
Necesitaba comprobar el "contenedor" de 'nombre', ¡así que funcionó!
Después de eso, esto funcionó igual:
Espero eso ayude.
fuente
Vine a esta página para obtener una respuesta, pero se me ocurrió una sintaxis en línea más corta que es:
fuente
Para su
if
estado de cuenta, debe utilizartypeof
:fuente
Lo que hago es simplemente pasar un objeto predeterminado al que llamo 'data' = '' y pasarlo a todas mis plantillas ejs. Si necesita pasar datos reales a la plantilla ejs, agréguelos como propiedad del objeto 'datos'.
De esta manera, el objeto 'datos' siempre se define y nunca obtiene un mensaje de error indefinido, incluso si la propiedad de 'datos' existe en su plantilla ejs pero no en su ruta expresa de nodo.
fuente
Tuve el mismo problema y, afortunadamente, descubrí que también hay una función de cortocircuito en JS (sabía que había una en Ruby y en algunos otros idiomas).
En mi servidor / lado del controlador (esto es de Node.js / Express):
¿Ves lo que hice ahí? El && que sigue a una variable posiblemente indefinida (es decir,
request.session.survey_result
, un objeto, que puede tener o no datos de formulario) es la notación de cortocircuito en JS. Lo que hace es solo evaluar la parte que sigue a && si la parte a la izquierda de && NO está indefinida. Tampoco arroja un error cuando la parte izquierda ESundefined
. Simplemente lo ignora.Ahora, en mi plantilla (recuerde que pasé el objeto
req.session.survey_result_survey
objeto a mi vista comosurvey_result
) y luego rendericé los campos como:También utilicé el cortocircuito allí, solo para resguardos.
Cuando lo probé con las formas sugeridas anteriormente, simplemente:
A veces, todavía intentaría evaluar las propiedades dentro de la declaración IF ... ¿Quizás alguien pueda ofrecer una explicación de por qué?
Además, quería corregir eso
undefined
debe ser sin las comillas simples, como vi en ejemplos anteriores. Porque la condición nunca se evaluará atrue
, ya que está comparando un valor de cadena'undefined'
con un tipo de datosundefined
.fuente
Puedes usar este truco:
donde el alcance es el objeto principal del usuario
fuente
Si planea usar el mismo objeto con frecuencia, puede usar una función como esta:
uso:
fuente
Se me ocurrió otra solución.
Espero que esto ayude.
fuente