2012-05-19 3 views
1

Existe-t-il une meilleure pratique de validation lors de l'utilisation d'un moteur de modèle?Validation des variables de modèle dans JavaScript

Je suis actuellement en train de construire un site avec node.js et couchdb, et j'utilise express avec ejs comme moteur de framework et de template respectivement. Il est possible que je me retrouve avec [Object object] ou undefined épelé littéralement dans mon HTML. Je peux essayer de valider dans le canapé avec une fonction validate_doc_update, ou dans un noeud dans ma fonction de routage avant de rendre le template, ou directement dans le template ejs. Lequel de ces ou tous ceux-ci devrais-je faire?

Répondre

1

Je suggère d'écrire une fonction pour prendre votre objet de contexte modèle et le préparer pour le rendu. On les appelle parfois des fonctions de présentateur et/ou le modèle de présentateur. Vous utiliserez ceci depuis votre fonction de routage node.js avant de rendre le template. Cette fonction peut remplacer null/undefined avec une chaîne vide et également détecter des objets dont toString est "[Object object]" ou autrement indésirable et les remplacer par une chaîne vide. Il est facile d'écrire des tests unitaires pour cela et vous évitera d'avoir à dupliquer la logique dans de nombreux modèles. Cette fonction doit parcourir récursivement un graphe d'objet entier ou un tableau de graphes d'objets.

Vous pouvez également vouloir d'autres fonctionnalités comme l'abréviation de chaînes anormalement longues. Par exemple, si quelqu'un colle accidentellement dans un tas d'ordures dans le champ "firstName" de votre objet utilisateur et que la limite est de 100 caractères, votre fonction de présentateur pourrait le tronquer et ajouter une ellipse. Juste un autre exemple de cette logique de nettoyage de données ou de "présentation". Dans le cas contraire, vous avez besoin d'expressions telles que <%= someObj.someProp || '' %> dans vos modèles ejs, ce qui entraînera beaucoup de duplication de code standard.

Here's a first-cut working jsfiddle implementation (utilise underscore.js).

function sanitize(context) { 
    if (Array.isArray(context)) { 
     return _.map(context, sanitize); 
    } 
    _.each(context, function (value, key) { 
     if (value === null) { 
      context[key] = ""; 
      return; 
     } 

     switch (typeof value) { 
      case "object": 
      context[key] = sanitize(value); 
      break; 
      case "number": 
      //No-op 
      break; 
      case "boolean": 
      //No-op 
      break; 
      default: 
      context[key] = value || ""; //handles undefined 
     }     
    }); 
    return context; 
} 
+0

Merci! Excellente solution Hmm..Je parie qu'il est possible d'écrire une fonction de présentateur qui pourrait fonctionner pour tous mes modèles. Pourriez-vous poster un exemple? J'ai du mal à réfléchir à la façon de parcourir récursivement un graphe d'objets entier. array.forEach (function() {if (typeof this === 'array' || 'objet') {this.forEach}) Quelque chose comme ça, n'est-ce pas? – Costa

+0

Vous Rock! Merci beaucoup. – Costa

Questions connexes