不降级Mongoose版本,修复Model.findOne()不支持回调的错误
修复Mongoose高版本下的Express登录接口错误
问题说明
运行Express登录接口时抛出错误:Model.findOne() no longer accepts a callback,需在不降级Mongoose版本的前提下修复代码,使接口正常运行。
错误根源
- 高版本Mongoose已废弃回调函数传参方式,仅支持Promise风格调用
- 原代码存在逻辑缺陷:使用
find()返回数组,判断!user永远不会触发(空数组属于真值);同时混用await与.then(),代码冗余且易出问题
修复后的完整代码
router.post('/login', async(req, res) => { // 解构获取请求参数 const { email, password, userType } = req.body; let userSchema; let redirectUrl; // 根据用户类型匹配对应Schema与跳转地址 switch(userType) { case 'customer': userSchema = Customers; redirectUrl = '/customer/home'; break; case 'hotel_owner': userSchema = HotelOwners; redirectUrl = '/hotel_owner/home'; break; case 'advertiser': userSchema = Advertisers; redirectUrl = '/advertiser/home'; break; case 'destination_manager': userSchema = DestinationManagers; redirectUrl = '/destination_manager/home'; break; case 'admin': userSchema = Admin; redirectUrl = '/admin/home'; break; default: // 处理未知用户类型 return res.status(400).send({ message: "无效的用户类型" }); } try { // 使用findOne查询单个用户,适配高版本Mongoose的Promise API const user = await userSchema.findOne({ email, password }); if (!user) { return res.status(401).send({ message: "邮箱或密码错误" }); } // 用户验证通过,跳转至对应首页 res.redirect(redirectUrl); } catch (err) { console.error(err); res.status(500).send({ message: "服务器内部错误" }); } });
关键修复点
- 替换查询方法:用
findOne()替代find(),登录场景只需查询单个用户,返回的对象可直接判断是否存在 - 统一异步处理:移除
.then()/.catch(),改用try/catch配合async/await,完全适配高版本Mongoose的Promise调用方式 - 优化分支逻辑:用
switch替代多层if-else,代码结构更简洁易维护 - 增加边界处理:对未知用户类型直接返回错误,避免后续无意义的查询操作
- 简化代码写法:通过解构赋值获取请求参数,提升代码可读性与简洁度
内容的提问来源于stack exchange,提问作者Kavija Sapukotana
相关产品推荐
相关产品推荐

