Jsrender: Comment gérer les exceptions d'erreur JsRender lors de la compilation ou du rendu côté serveur ?

Créé le 23 mars 2016  ·  14Commentaires  ·  Source: BorisMoore/jsrender

Salut,
J'ai la structure suivante (oubliez l'extension twig, c'est à gauche de mes tests 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'

Je n'obtiens aucune erreur, juste une page blanche.

Comment appliquer ceci sur le serveur :

        $.views.settings.debugMode(true);

Est-ce correct :

jsrender.views.settings.debugMode(true)

Que manque-t-il s'il vous plait ?

Commentaire le plus utile

Les chemins "./..." sont des chemins relatifs - ils sont relatifs au script appelant - dans votre cas app.js. Ils n'ont rien à voir avec Express.

Vous devez écrire {{include tmpl='./templates/test.html' /}}

OTOH si vous utilisez Hapi ou Express, vous pouvez définir l'emplacement du répertoire des modèles, puis écrire res.render('_includes/footer', ... où vous utilisez une API Express - par conséquent, le chemin est relatif au dossier de modèles que vous avez configuré pour Express, et vous omettent l'extension .html, puisque vous l'avez également configurée pour express.

Les chemins JsRender './...' fonctionnent aussi bien que vous utilisiez Express, Hapi ou aucun.

Tout cela est montré dans les exemples ici https://github.com/BorisMoore/jsrender-node-starter , et les docs ici http://www.jsviews.com/#node/filetmpls.

Avez-vous commencé à partir de ces échantillons? Si c'est le cas, vous auriez dû partir des chemins relatifs ./... corrects...

Tous les 14 commentaires

L'erreur que vous avez est une erreur de syntaxe :

{{include tmpl='./_includes/footer.html'}} (il manque la barre oblique fermante)

devrait être

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

Lorsque vous exécutez Node, si JsRender est lancé, Node interceptera l'exception et la transmettra à votre rappel de rendu, et vous devrez vous en occuper là-bas.

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

Par exemple, vous pouvez lui faire rendre l'erreur en écrivant :

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

Vous pouvez également exécuter node en mode débogage et intercepter les erreurs avec des points d'arrêt. (En utilisant node-debug ...)

Oui, le paramètre pour debugMode(true) est jsrender.views.settings.debugMode(true); - et cela fonctionnera pour rendre toutes les erreurs de rendu - au lieu de lever des exceptions. Mais les erreurs de syntaxe dans le modèle seront toujours levées, car elles se produisent lors de la compilation du modèle, pas lors du rendu...

J'ai changé le titre de ce numéro, pour correspondre au scénario qui nous intéresse ici.

J'ai maintenant ajouté le gestionnaire d'erreurs à mon application Express comme ceci :

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

Je documenterai mon expérience ici pour quiconque à l'avenir.

–––
Je reçois des erreurs maintenant !

{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

J'ai essayé de supprimer le point du chemin mais j'obtiens:

test _includes/footer.html

C'est ma configuration de vues:

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

Étrange,

Cela rend correctement le pied de page :

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

Si j'inclus le pied de page dans la mise en page comme ceci :

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

Je viens d'afficher ceci :

_includes/footer

J'ai créé un projet de test simple ici pour tester l'include :

ici

Mais au lieu de restituer les fichiers inclus, il affiche simplement le nom de fichier inclus ?

Les chemins "./..." sont des chemins relatifs - ils sont relatifs au script appelant - dans votre cas app.js. Ils n'ont rien à voir avec Express.

Vous devez écrire {{include tmpl='./templates/test.html' /}}

OTOH si vous utilisez Hapi ou Express, vous pouvez définir l'emplacement du répertoire des modèles, puis écrire res.render('_includes/footer', ... où vous utilisez une API Express - par conséquent, le chemin est relatif au dossier de modèles que vous avez configuré pour Express, et vous omettent l'extension .html, puisque vous l'avez également configurée pour express.

Les chemins JsRender './...' fonctionnent aussi bien que vous utilisiez Express, Hapi ou aucun.

Tout cela est montré dans les exemples ici https://github.com/BorisMoore/jsrender-node-starter , et les docs ici http://www.jsviews.com/#node/filetmpls.

Avez-vous commencé à partir de ces échantillons? Si c'est le cas, vous auriez dû partir des chemins relatifs ./... corrects...

Merci ça marche !

J'ai étudié le /jsrender-node-starter, mais il n'était pas clair pour moi qu'il soit relatif au script d'appel et je ne me souviens pas de l'avoir lu dans le manuel. Il dit simplement que c'est relatif mais pas du script d'appel. Mais maintenant c'est clair !

Bon - cela n'expliquait pas le script d'appel, mais en fait c'est standard pour le nœud, les chemins sont juste utilisés avec la sémantique standard. Lorsque vous êtes nouveau sur node, il est parfois déroutant. Mais les exemples dans les docs montrent ./templates/... donc suggèrent que l'origine est plus haut que le dossier du modèle (si celui-ci est attribué).

J'ai supposé (à tort) qu'après l'avoir enregistré en tant que View Engine, les importations se comportent comme Express.

Merci Boris !

Sûr!

Existe-t-il un moyen d'obtenir des erreurs pour les erreurs de syntaxe ?

En ce qui concerne JsRender, s'il détecte une erreur de syntaxe, il lève une exception d'erreur correspondante.

Ce qui arrive à l'exception dépend alors de vous et de l'environnement dans lequel vous exécutez. Vous pouvez écrire sur la console ou rendre le navigateur, comme vous le souhaitez - en configurant le gestionnaire d'erreurs approprié pour intercepter l'erreur et le faire.

Si vous voulez dire sur le serveur dans Express, eh bien encore une fois, c'est à vous d'attraper l'erreur, ou de configurer la gestion des erreurs comme vous le souhaitez, ou d'utiliser les autres middleware disponibles, etc. http://expressjs.com/en/guide/ gestion des erreurs.html.

Si vous avez défini debugMode(true) ou similaire, alors si l'erreur s'est produite lors du rendu, JsRender ne lancera pas, mais inclura le message d'erreur dans la sortie. Il vaut mieux garder debugMode à false, si vous voulez intercepter des exceptions. Ensuite, vous pouvez utiliser Express standard sans middleware supplémentaire et écrire, par exemple :

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)
  });
});


Merci et Happy Eastern :danseurs:

Cette page vous a été utile?
0 / 5 - 0 notes