2017-03-24 1 views
5

J'utilise Joi pour valider une charge utile d'un service dans mon serveur node.js en utilisant le framework hapijs. Il sert à ressembler à ceci (dans mon code dactylographiée ainsi qu'après la compilation de javascript):Définir la valeur par défaut de la validation

payload: { 
    para1: Joi.number().required(), 
    para2: Joi.string() 
} 

Maintenant, je veux définir la valeur par défaut des deux paramètres. Si le code est écrit en javascript, je peux le faire:

payload: { 
    para1: Joi.number().required().default(1), 
    para2: Joi.string().default("defaultstring") 
} 

Je l'ai testé dans fanfaronnades et les valeurs par défaut est devenu en fait les valeurs que je jeu.

Cependant, mon projet est écrit en tapuscrit. J'ai fait la même chose et compilé le code de type. Le résultat javascript ressemble à ceci:

payload: { 
    para1: Joi.number().required()["default"](1), 
    para2: Joi.string()["default"]("defaultstring") 
} 

En swagger, les valeurs par défaut ne sont pas appliquées.

Voici mes questions:

  1. pourquoi le code devient différent après la compilation? Qu'est-ce que ["default"]("defaultstring") signifie et que fait-il?
  2. comment puis-je écrire un code tapuscrit pour vous assurer qu'il peut compilé comme Joi.string().default("defaultstring")

Mise à jour

Selon le poste @ RÉR, le format en question 2 est tout simplement différente façon d'accéder à la propriété de l'objet. Je reçois également la référence de here. Mais cela n'explique pas s'ils ont une différence quelconque. Est-ce que quelqu'un a une idée?

Update2

Here est la différence entre les deux façons accès à la propriété JS. Il semble qu'il n'y ait pas d'effet négatif en utilisant des parenthèses. Cependant, dans mon cas, les valeurs par défaut ne sont pas reflétées sur swagger. Je ferai des recherches à ce sujet.

+0

Enfin compris. Lorsque j'utilise un script de type, les notes de swagger sont générées à partir de la fonction initiale de la frappe, et non du fichier JS. Il n'y a pas de problème avec le code lui-même. – zhangjinzhou

Répondre

2

En JavaScript ceci:

required().default(1) 

est la même que celle-ci:

required()["default"](1) 

parce que vous pouvez accéder aux propriétés de l'objet soit comme:

object["propertyName"] 

ou:

object.propertyName 

(avec certaines restrictions dans le second cas). Il est donc étrange que TypeScript affiche le style le plus long si ce n'est pas le cas, mais il est également étrange que le style le plus long ne fonctionne pas exactement de la même manière que le plus court.

Je voudrais essayer de changer manuellement le JavaScript compilé à la version plus courte et voir si cela aide.Si ce n'est pas le cas, le problème est ailleurs. Mon soupçon est que ça ne va pas aider.

Le .default() devrait fonctionner dactylographiée parce qu'il est défini dans @types/joi - voir:

Mais d'autre part, il y a ce commentaire:

// TODO express type of Schema in a type-parameter (.default, .valid, .example etc) 

qui peut suggérer que la mise en œuvre .default() n'est pas encore prête - voir:

et aussi il y a cette question: joi.d.ts out of date, missing types

+0

Merci pour la réponse. Il est bon de savoir qu'il existe un autre moyen d'accéder à l'objet dans JS. Probablement je ne peux pas vous prendre la solution parce que le JavaScript compilé changeant n'est pas une manière soutenable de traiter le problème. J'utilise gulp pour développer le logiciel. Par conséquent, chaque fois que j'ai changé quelque chose, tous les fichiers seront recompilés. – zhangjinzhou

+0

si le @ types/joi n'est pas bien développé, pourquoi est-il encore compilé comme le style plus long JS? – zhangjinzhou

0

utilisation doit utiliser par défaut() comme dans ci-dessous le code:

validate: { 
     payload: { 
      para1: Joi.number().integer().min(1).max(100).default(10).required(), 
      para2: Joi.string().min(1).max(100).default("TEST").required(), 
     } 
    } 
+0

quelle est la différence? Je pense qu'il se comporte comme mon code – zhangjinzhou

+0

Rien n'est différent mais ci-dessus le code est bien formaté et bloc complet. –

+0

Merci! Garder cela à l'esprit. – zhangjinzhou