You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证注册请求中的邮箱及数据有效性?附相关代码示例

注册请求的数据与邮箱验证方案

一、修复并增强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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:20:53