À 3 heures du matin, un coup de téléphone effréné a brisé le silence. Notre base de données de production regorgeait de profils d'utilisateurs incomplets : un point de terminaison d'enregistrement avait silencieusement accepté des valeurs nulles pendant des mois ! Le coupable ? Un oubli flagrant : absence de validation des champs et de vérification de l'existence des utilisateurs.
Cette expérience m'a appris une leçon cruciale : une validation de terrain robuste et des contrôles d'existence des utilisateurs ne sont pas facultatifs : ils constituent le fondement de l'intégrité des données. Explorons comment intégrer ces protections dans vos applications Node.js, en tirant parti des enseignements tirés d'innombrables sessions de lutte contre les incendies de production.
La structure de notre projet sera simple :
<code>cd src && mkdir utils cd utils && touch validateRequiredFields.ts checkUserExists.ts</code>
Cela crée deux modules de base :
validateRequiredFields.ts
: Gère la validation du champ de saisie.checkUserExists.ts
: Gère les chèques pour les utilisateurs existants.Le problème : Les requêtes incomplètes ou invalides peuvent corrompre les données et faire planter les services.
La solution :
Dans validateRequiredFields.ts
:
<code class="language-typescript">// utils/validateRequiredFields.ts interface ValidationResult { isValid: boolean; error?: string; } export const validateRequiredFields = (fields: Record<string, any>): ValidationResult => { const missing = Object.entries(fields) .filter(([_, value]) => !value?.toString().trim()) .map(([key]) => key); if (missing.length > 0) { return { isValid: false, error: `Missing fields: ${missing.join(', ')}` }; } return { isValid: true }; };</code>
Meilleure pratique : Combinez cela avec la validation de schéma (par exemple, Zod, Joi) pour les règles complexes. Un champ de mot de passe contenant uniquement des espaces m'a appris cette leçon à mes dépens !
Intégration Express.js :
<code class="language-typescript">// routes/auth.ts app.post('/register', async (req, res) => { const { email, password } = req.body; const validation = validateRequiredFields({ email, password }); if (!validation.isValid) { return res.status(400).json({ error: validation.error }); } // ... registration logic ... });</code>
Le problème : Comptes et opérations en double sur des utilisateurs inexistants.
La solution :
Dans checkUserExists.ts
:
<code class="language-typescript">// utils/checkUserExists.ts import pool from '../db/db'; interface CheckResult { exists: boolean; userData?: any; } export const checkUserExists = async (email: string, shouldExist: boolean = true): Promise<CheckResult> => { const result = await pool.query( 'SELECT * FROM users WHERE LOWER(email) = LIMIT 1', [email.trim()] ); const exists = result.rows.length > 0; if (shouldExist && !exists) throw new Error('User not found'); if (!shouldExist && exists) throw new Error('Email already registered'); return { exists, userData: exists ? result.rows[0] : undefined }; };</code>
Point clé : Normalisez toujours les e-mails (minuscules, coupe) pour éviter les problèmes sensibles à la casse. Une session de débogage de quatre heures m’a appris cette leçon !
Exemple d'utilisation :
<code class="language-typescript">// routes/auth.ts app.post('/register', async (req, res) => { try { await checkUserExists(email, false); // Expect no existing user // ... create user ... } catch (error) { return res.status(409).json({ error: error.message }); } });</code>
Cette approche utilise une défense à trois niveaux :
Ce tiercé trio empêche :
Leçons tirées d'innombrables déploiements :
Examinez un point de terminaison d'authentification. Identifiez les contrôles de validation manquants. Implémentez ces utilitaires et soyez témoin de la magie de moins d'erreurs ! N'oubliez pas qu'une validation robuste est un investissement dans un avenir plus stable et plus sûr.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!