Jsrender: ¿Cómo lidiar con las excepciones de error de JsRender durante la compilación o el procesamiento del lado del servidor?

Creado en 23 mar. 2016  ·  14Comentarios  ·  Fuente: BorisMoore/jsrender

Hola,
Tengo la siguiente estructura (olvídese de la extensión twig, queda de mis pruebas nunjucks):

            var appData ={};
            res.render('layout', appData, function(err, html) {
               res.send(html);
            });
{{include tmpl='./_includes/footer.html'}} 
//if i remove the import, the template get rendered and shows 'test'

No recibo errores, solo una página en blanco.

Cómo aplicar esto en el servidor:

        $.views.settings.debugMode(true);

Es esto correcto :

jsrender.views.settings.debugMode(true)

¿Qué falta por favor?

Comentario más útil

Las rutas "./..." son rutas relativas, son relativas al script de llamada, en su caso, app.js. No tienen nada que ver con Express.

Tienes que escribir {{include tmpl='./templates/test.html' /}}

OTOH, si usa Hapi o Express, puede definir la ubicación del directorio de plantillas y luego escribir res.render('_includes/footer', ... donde está usando una API Express; por lo tanto, la ruta es relativa a la carpeta de plantillas que configuró para Express, y usted están omitiendo la extensión .html, ya que también la configuró para express.

Las rutas JsRender './...' funcionan igual de bien si usa Express, Hapi o ninguno.

Todo lo que se muestra en los ejemplos aquí https://github.com/BorisMoore/jsrender-node-starter y los documentos aquí http://www.jsviews.com/#node/filetmpls.

¿Empezaste con esas muestras? Si es así, debería haber comenzado desde las rutas relativas correctas ./... ...

Todos 14 comentarios

El error que tienes es un error de sintaxis:

{{include tmpl='./_includes/footer.html'}} (Falta la barra inclinada de cierre)

debiera ser

{{include tmpl='./_includes/footer.html' /}}

Cuando se ejecuta en Node, si JsRender arroja, Node detectará la excepción y la pasará a su devolución de llamada de procesamiento, y tendrá que lidiar con eso allí.

res.render('layout', appData, function(err, html) {
    res.send(html);
}); callback:

Por ejemplo, puede hacer que muestre el error escribiendo:

res.render(..., function(err, html) {
    res.send(err ? jsrender.views.converters.html(err.message) : html); // HTML encode message
});

También puede ejecutar el nodo en modo de depuración y detectar los errores con puntos de interrupción. (Usando la depuración de nodos...)

Sí, la configuración para debugMode (true) es jsrender.views.settings.debugMode(true); , y eso funcionará para generar cualquier error de representación, en lugar de generar excepciones. Pero los errores de sintaxis en la plantilla seguirán apareciendo, ya que ocurren durante la compilación de la plantilla, no durante el renderizado...

Cambié el título de este número para que corresponda con el escenario que nos ocupa aquí.

Ahora he agregado el controlador de errores a mi aplicación Express de esta manera:

        app.use('development', function(){
            app.use(errorhandler());
        });

Voy a documentar mi experiencia aquí para cualquier persona en el futuro..

–––
¡Recibo errores ahora!

{Error: ENOENT: no such file or directory, open './_includes/footer.html'}
"start": " tsc -w & export NODE_ENV=development nodemon & app.js"

console.log('env:',process.env.NODE_ENV); // env: development

Intenté eliminar el punto de la ruta pero luego obtengo:

test _includes/footer.html

Esa es mi configuración de vistas:

app.set('views', __dirname + '/app'); 
console.log('js views debug mode: ', jsrender.views.settings.debugMode() ); // returns true

Extraño,

Esto representa correctamente el pie de página:

res.render('_includes/footer', appData, function(err, html) {
                res.send(err ? jsrender.views.converters.html(err.message) : html); 
            });

Si incluyo el pie de página en el diseño de esta manera:

{{include tmpl='_includes/footer' /}}

Acabo de mostrar lo siguiente:

_includes/footer

Creé un proyecto de prueba simple aquí para probar el include:

aquí

Pero en lugar de representar los archivos incluidos, solo genera el nombre de archivo incluido.

Las rutas "./..." son rutas relativas, son relativas al script de llamada, en su caso, app.js. No tienen nada que ver con Express.

Tienes que escribir {{include tmpl='./templates/test.html' /}}

OTOH, si usa Hapi o Express, puede definir la ubicación del directorio de plantillas y luego escribir res.render('_includes/footer', ... donde está usando una API Express; por lo tanto, la ruta es relativa a la carpeta de plantillas que configuró para Express, y usted están omitiendo la extensión .html, ya que también la configuró para express.

Las rutas JsRender './...' funcionan igual de bien si usa Express, Hapi o ninguno.

Todo lo que se muestra en los ejemplos aquí https://github.com/BorisMoore/jsrender-node-starter y los documentos aquí http://www.jsviews.com/#node/filetmpls.

¿Empezaste con esas muestras? Si es así, debería haber comenzado desde las rutas relativas correctas ./... ...

¡Gracias eso funciona!

Estudié /jsrender-node-starter, pero no me quedó claro si es relativo al script de llamada y no puedo recordar que lo leí en el manual. Simplemente dice que es relativo pero no del script de llamada. ¡Pero ahora está claro!

Correcto: no explicó el script de llamada, pero de hecho es estándar para el nodo, las rutas solo se usan con la semántica estándar. Cuando es nuevo en el nodo, a veces es confuso. Pero los ejemplos en los documentos muestran ./templates/... así que sugiera que el origen esté más arriba que la carpeta de la plantilla (si hay una asignada).

Asumí (equivocadamente) que después de registrarlo como View Engine, las importaciones se comportan como Express.

¡Gracias Boris!

¡Seguro!

¿Hay alguna manera de obtener errores por errores de sintaxis?

En lo que respecta a JsRender, si detecta un error de sintaxis, arroja una excepción de error correspondiente.

Lo que suceda con la excepción depende de usted y del entorno en el que se esté ejecutando. Puede escribir en la consola o renderizar en el navegador, como desee, configurando el controlador de errores apropiado para detectar el error y hacerlo.

Si te refieres al servidor en Express, bueno, de nuevo, depende de ti detectar el error, o configurar el manejo de errores como quieras, o usar el otro middleware disponible, etc. http://expressjs.com/en/guide/ manejo de errores.html.

Si configuró debugMode(true) o similar, entonces si el error se produjo durante el procesamiento, JsRender no lo generará, pero incluirá el mensaje de error en la salida. Es mejor mantener debugMode en falso, si desea detectar excepciones. Luego puede usar Express estándar sin middleware adicional y escribir, por ejemplo:

app.get('/', function(req, res) { // Express template
  res.render('layout-movies', appData, function(err, html) {
    if (err) {
      console.log("Error: " + err.message);
    }
    res.send(html)
  });
});


Gracias y Felices Pascuas :bailarines:

¿Fue útil esta página
0 / 5 - 0 calificaciones