凌晨3点,一通疯狂的电话打破了宁静。我们的生产数据库充满了不完整的用户配置文件——注册端点几个月来一直默默地接受空值! 罪魁祸首? 一个明显的疏忽:缺少字段验证和用户存在检查。
这次经历给了我一个重要的教训:强大的现场验证和用户存在检查不是可选的 - 它们是数据完整性的基石。 让我们利用从无数生产消防会议中吸取的经验教训,探索如何将这些保护措施构建到您的 Node.js 应用程序中。
我们的项目结构将很简单:
<code>cd src && mkdir utils cd utils && touch validateRequiredFields.ts checkUserExists.ts</code>
这将创建两个核心模块:
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>
要点: 始终规范电子邮件(小写、修剪)以避免区分大小写的问题。 四小时的调试课程让我学到了这一课!
使用示例:
<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>
此方法采用三层防御:
这三重奏可以防止:
从无数部署中汲取的经验教训:
>查看身份验证端点。确定缺失的验证检查。实施这些公用事业并见证了错误的魔力! 请记住,强大的验证是对更稳定和安全的未来的一项投资。
>以上是掌握现场验证和用户存在检查。的详细内容。更多信息请关注PHP中文网其他相关文章!