午前 3 時、熱狂的な電話が静寂を打ち破りました。私たちの運用データベースは不完全なユーザー プロファイルで溢れていました。登録エンドポイントは何ヶ月もの間、黙って null 値を受け入れていました。 犯人は? 明らかな見落とし: フィールド検証とユーザー存在チェックの欠落。
この経験は私に重要な教訓を与えてくれました。堅牢なフィールド検証とユーザー存在チェックはオプションではなく、データ整合性の基盤であるということです。 無数の本番環境の消火活動セッションから学んだ教訓を活用して、これらの安全装置を Node.js アプリケーションに組み込む方法を探ってみましょう。
プロジェクトの構造は簡単です:
<code>cd src && mkdir utils cd utils && touch validateRequiredFields.ts checkUserExists.ts</code>
これにより、2 つのコア モジュールが作成されます:
validateRequiredFields.ts
: 入力フィールドの検証を処理します。checkUserExists.ts
: 既存ユーザーのチェックを管理します。問題: 不完全または無効なリクエストはデータを破損し、サービスをクラッシュさせる可能性があります。
解決策:
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>
ベスト プラクティス: 複雑なルールの場合は、これをスキーマ検証 (Zod、Joi など) と組み合わせます。 スペースのみのパスワード フィールドは、私にその教訓を大変な方法で教えてくれました!
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>
問題: 存在しないユーザーに対するアカウントと操作が重複します。
解決策:
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>
キーポイント: 大文字と小文字を区別する問題を避けるために、電子メールは常に正規化 (小文字、トリミング) してください。 4 時間のデバッグ セッションでその教訓が得られました!
使用例:
<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>
このアプローチでは、次の 3 層の防御が採用されています。
この 3 つの要素により、次のことが防止されます。
無数の導入から学んだ教訓:
認証エンドポイントを確認します。欠落している検証チェックを特定します。これらのユーティリティを実装し、より少ないエラーの魔法を目撃してください! 堅牢な検証は、より安定した安全な未来への投資であることを忘れないでください。
以上がnode.jsのフィールド検証とユーザーの存在のマスターチェック:開発者のサバイバルガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。