Je souhaite partager la validation d'entrée parce que:
Quelle est la meilleure façon de partager la validation d'entrée dans une application Web javascript complète (frontend: react, backend: nodejs)?
La solution à laquelle je pense est de créer un module de validation avec tous mes validateurs javascript à la racine de ma base de code:
const validator = process.env.ENV === 'local'? require ('../../ validator'): require ('/ validator')
Existe-t-il une autre méthode largement acceptée pour ce faire (je suppose que c'est un problème très courant mais je n'ai pas trouvé de problèmes similaires)? Sinon, ma méthode est-elle correcte?
3 Réponses :
Habituellement, vous feriez des validations simples sur le front-end et des validations plus complexes sur le backend
Par exemple: valider si e-mail avec regex sur le front-end, envoyer un simple mail pour confirmer l'existence de cet e-mail
Plus complexe signifie souvent que vous pouvez au moins construire sur le simple. C'est pourquoi je voudrais dupliquer la validation frontend avec backend. Cela n'implique pas que je ne fais pas de validation personnalisée dans le backend. Le code résultant dans le backend n'est peut-être pas optimisé en suivant cette méthode, mais je recherche davantage une sécurité supplémentaire + une synchronisation frontend / backend que des performances supplémentaires ici.
C'est une bonne pratique d'utiliser les validations en tant que module, mais vous devriez considérer ce qui se passerait si, pour une raison quelconque, vous deviez / vouliez changer la technologie back-end en quelque chose qui ne ressemble pas à Javascript.
Dans le cas où vous allez l'implémenter - vous aurez une dépendance du client et du serveur sur ce module et vous devrez maintenir différentes versions de ce module ou déployer le code client et le code serveur à chaque fois que vous aurez une validation changement - ce qui entraîne une certaine complexité que vous devez également prendre en compte.
Points à retenir des réponses et de la mise en œuvre:
export
dans mon validateur mais utilisez module.exports = {}
, car l ' exportation
ES6 ne fonctionnera pas dans nodejs) validator
et testez dans les deux environnements (j'ai ajouté un script qui s'exécute avant le déploiement et vérifier les différences entre les 2 modules)
Je me demandais, comment avez-vous mis en œuvre cela? Je pense faire quelque chose de similaire, mais je ne sais pas par où commencer ... Avez-vous créé un nouveau package importé à la fois par FE et BE comme import 'my-shared-module'
? Ou faites-vous simplement référence au dossier qui se trouve en dehors des deux projets?
D'après ce dont je me souviens, j'ai fait l'importation conditionnelle en fonction de mon environnement. Si je suis en local, je me réfère à un dossier en dehors du projet. Si dans prod je me suis référé directement au fichier (ils ont tous deux été copiés par un script avant le déploiement). Je ne sais pas si c'est clair, je peux préciser.
Je pense qu'il y a de meilleures façons de le faire à coup sûr
Vous avez raison de vouloir valider à la fois le front-end et le back-end. La façon dont vous faites cela dépend de vous, mais votre solution pourrait fonctionner si votre validation est un module quelconque. Je dirais que vous avez besoin d'une validation différente pour FE vs BE, car vous avez des objectifs différents. FE - parcours de l'utilisateur, n'autorisant pas l'entrée qui échouera / erreur. BE - ne pas autoriser les données endommagera / endommagera le système, et FE + BE - s'assurer que les données sont `` valides '' (c'est-à-dire que le numéro de téléphone est un numéro de téléphone, etc.).
Mais partager le code serait extrêmement utile. Un utilisateur avec un navigateur à jour n'essayant pas de contourner la validation frontend obtiendrait toujours ses erreurs avant de soumettre son entrée. J'aurais donc au moins besoin d'une validation backend aussi stricte que mon frontend, puis je pourrais ajouter une validation personnalisée dans le backend. Le partager permettrait de gagner beaucoup de temps, d'éviter les doublons de code et de synchroniser les équipes backend et frontend lorsqu'elles modifient la validation des entrées. Merci d'avoir soulevé la différence intéressante entre les données valides et nuisibles