如何验证注册请求中的邮箱及数据有效性?附相关代码示例
注册请求的数据与邮箱验证方案
一、修复并增强Mongoose Schema验证
你当前的Schema存在语法错误(require应为required: true),且缺少邮箱格式校验、重复邮箱校验,以下是修正后的版本:
const mongoose = require('mongoose'); const UserSchema = new mongoose.Schema({ name: { type: String, required: true, // 修正拼写错误 minlength: 6, // 字符串类型需用minlength/maxlength而非min/max maxlength: 250 }, email: { type: String, required: true, minlength: 6, maxlength: 250, match: /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/, // 正则验证标准邮箱格式 unique: true // 数据库层面确保邮箱唯一,避免重复注册 }, password: { type: String, required: true, minlength: 6, maxlength: 1100 } }); const User = mongoose.model("User", UserSchema); module.exports = User;
二、前置请求参数验证(数据库保存前拦截无效请求)
在调用data.save()之前,先手动校验请求参数合法性,提前返回明确错误:
// 记得先引入jwt const jwt = require('jsonwebtoken'); RouterUser.post('/register', async (req, res) => { const { name, email, password } = req.body; // 1. 检查必填字段是否齐全 if (!name || !email || !password) { return res.status(400).json({ message: "失败", error: "姓名、邮箱、密码均为必填项" }); } // 2. 校验字段长度 if (name.length < 6 || name.length > 250) { return res.status(400).json({ message: "失败", error: "姓名长度需在6-250字符之间" }); } if (password.length < 6 || password.length > 1100) { return res.status(400).json({ message: "失败", error: "密码长度需在6-1100字符之间" }); } // 3. 提前验证邮箱格式 const emailRegex = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/; if (!emailRegex.test(email)) { return res.status(400).json({ message: "失败", error: "邮箱格式无效" }); } // 4. 检查邮箱是否已注册 const existingUser = await user.findOne({ email }); if (existingUser) { return res.status(400).json({ message: "失败", error: "该邮箱已被注册" }); } // 保存数据并生成token try { const data = new user({ name, email, password }); const { _id } = await data.save(); const token = jwt.sign({ _id_user: _id }, process.env.tokenPass); res.header('auth-token', token).send(token); // 修正拼写错误:uath-token → auth-token } catch (err) { res.status(400).json({ message: "失败", error: err.message || "数据保存失败" }); } });
三、补充说明
- Schema中的
unique: true会创建数据库索引,确保邮箱唯一,但如果集合已有重复数据,创建索引会失败,需先清理重复数据。 - 若想简化校验逻辑,可以使用
joi或express-validator这类验证库,快速定义统一的校验规则。 - 原代码中
res.header('uath-token', token)存在拼写错误,已修正为auth-token。
内容的提问来源于stack exchange,提问作者Amar Ahmed
相关产品推荐
相关产品推荐

