Express后端注册接口如何校验用户提交的邮箱是否已被注册
注册邮箱重复校验实现方案
前置建议
首先建议你先在User模型的email字段加上unique: true的唯一索引配置,这是数据库层面的兜底防护,即使业务逻辑有疏漏也不会出现重复邮箱的脏数据,示例模型配置:
const userSchema = new mongoose.Schema({ name: String, email: { type: String, unique: true, // 核心配置,添加唯一索引 required: true }, password: String }) const User = mongoose.model('User', userSchema)
实现方式1:业务逻辑主动查询校验
在保存用户数据前,先查询数据库中是否存在同邮箱的用户,存在则直接返回错误:
//Create user app.post("/register/users", async (req, res, next) => { try { // 先校验邮箱是否已存在 const existUser = await User.findOne({ email: req.body.email }); if (existUser) { return res.status(409).json({ msg: "该邮箱已被注册,请更换后重试" }); } // 邮箱不存在则继续创建流程 let userData = { name: req.body.name, email: req.body.email, password: req.body.password, }; const user = new User(userData); const result = await user.save(); res.status(200).json(result._id); } catch (error) { res.status(422).json(error); } });
实现方式2:捕获唯一索引报错(适合高并发场景)
如果已经给email加了唯一索引,插入重复邮箱时MongoDB会抛出错误码为11000的重复键错误,直接捕获该错误返回对应提示即可,不需要额外做查询,性能更高且能完全避免并发问题:
//Create user app.post("/register/users", (req, res, next) => { let userData = { name: req.body.name, email: req.body.email, password: req.body.password, }; const user = new User(userData); user .save() .then((result) => { res.status(200).json(result._id); }) .catch((error) => { // 判断是否为重复邮箱的错误 if (error.code === 11000 && error.keyPattern?.email) { return res.status(409).json({ msg: "该邮箱已被注册,请更换后重试" }); } res.status(422).json(error); }); });
内容的提问来源于stack exchange,提问作者tirbushonn23
相关产品推荐
相关产品推荐

