Pada pukul 3 pagi, satu panggilan telefon yang panik memecah kesunyian. Pangkalan data pengeluaran kami dipenuhi dengan profil pengguna yang tidak lengkap—titik akhir pendaftaran telah menerima nilai nol secara senyap selama berbulan-bulan! Pesalahnya? Pengawasan yang ketara: tiada pengesahan medan dan semakan kewujudan pengguna.
Pengalaman ini mengajar saya pelajaran penting: pengesahan medan yang mantap dan semakan kewujudan pengguna bukan pilihan—ia adalah asas integriti data. Mari terokai cara membina perlindungan ini ke dalam aplikasi Node.js anda, memanfaatkan pengajaran yang dipelajari daripada sesi memadam kebakaran pengeluaran yang tidak terkira banyaknya.
Struktur projek kami adalah mudah:
<code>cd src && mkdir utils cd utils && touch validateRequiredFields.ts checkUserExists.ts</code>
Ini menghasilkan dua modul teras:
validateRequiredFields.ts
: Mengendalikan pengesahan medan input.checkUserExists.ts
: Mengurus semakan untuk pengguna sedia ada.Masalahnya: Permintaan yang tidak lengkap atau tidak sah boleh merosakkan data dan perkhidmatan ranap.
Penyelesaian:
Dalam 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>
Amalan Terbaik: Gabungkan ini dengan pengesahan skema (cth., Zod, Joi) untuk peraturan yang rumit. Medan kata laluan ruang sahaja mengajar saya pelajaran itu dengan cara yang sukar!
Penyepaduan 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>
Masalahnya: Akaun pendua dan operasi pada pengguna yang tidak wujud.
Penyelesaian:
Dalam 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>
Isi Utama: Sentiasa normalkan e-mel (huruf kecil, potong) untuk mengelakkan isu sensitif huruf besar. Sesi penyahpepijatan selama empat jam mengajar saya pelajaran itu!
Contoh Penggunaan:
<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>
Pendekatan ini menggunakan pertahanan tiga lapis:
Trifecta ini menghalang:
Pelajaran yang diperoleh daripada penggunaan yang tidak terkira banyaknya:
Semak titik akhir pengesahan. Kenal pasti semakan pengesahan yang hilang. Laksanakan utiliti ini dan saksikan keajaiban kesilapan yang lebih sedikit! Ingat, pengesahan yang teguh ialah pelaburan untuk masa depan yang lebih stabil dan terjamin.
Atas ialah kandungan terperinci Menguasai Pengesahan Bidang dan Pemeriksaan Kewujudan Pengguna di Node.js: Panduan Survival Pemaju. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!