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

网站注册功能报错:throw new Error('Options must be an object...')求排查

问题排查与修复方案

核心错误点

1. 模型实例化拼写错误

你看到的Options must be an object错误,根源在于创建用户时的模型名称拼写错误:

// 错误:小写的user不是定义好的模型
const user = new user({
    name,
    email,
    password: hashedPassword
})

前面检查邮箱存在时用的是User.exists(大写U),说明你的Mongoose模型是User,这里误用小写user会导致构造函数接收的参数被识别为无效选项,直接抛出错误。

2. 异步流程逻辑漏洞

User.exists使用回调函数实现,但后续的哈希密码、创建用户代码并未等待邮箱检查完成就直接执行,会导致:

  • 即使邮箱已存在,依然会执行创建用户的逻辑,造成数据重复
  • 回调的异步特性会破坏代码的执行顺序,引发不可预期的问题

修复后的完整代码

async postRegister(req, res) {
    try {
        const { name, email, password } = req.body
        // 字段校验
        if (!name || !email || !password) {
            req.flash('error', 'All fields are required')
            req.flash('name', name)
            req.flash('email', email)
            return res.redirect('/register')
        }

        // 异步检查邮箱是否存在
        const emailExists = await User.exists({ email })
        if (emailExists) {
            req.flash('error', 'Email already registered')
            req.flash('name', name)
            req.flash('email', email)
            return res.redirect('/register')
        }

        // 哈希密码
        const hashedPassword = await bcrypt.hash(password, 10)

        // 创建用户(修复模型名称拼写)
        const user = new User({
            name,
            email,
            password: hashedPassword
        })

        await user.save()
        // 注册成功跳转首页
        return res.redirect('/')
    } catch (err) {
        req.flash('error', 'Something went wrong')
        console.error(err) // 打印错误便于调试
        return res.redirect('/register')
    }
}

关键修复说明

  • 将new user改为new User,匹配定义好的Mongoose模型
  • 把User.exists的回调写法改为await异步写法,保证代码执行顺序符合业务逻辑
  • 用try/catch包裹整个流程,统一处理所有可能的异步错误(包括数据库查询、密码哈希、用户保存等环节)

内容的提问来源于stack exchange,提问作者hackercoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:52:48