网站注册功能报错: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
相关产品推荐
相关产品推荐

