Mongoose中基于枚举类型role属性过滤用户文档的静态方法实现问题
问题解决说明
你定义的findByRole静态方法本身逻辑不存在错误,不生效基本是调用方式不符合Mongoose异步规则导致的,以下是具体说明和修复方案:
核心问题:Mongoose查询方法返回的是Query对象,需要异步获取结果
你不能直接同步调用该方法拿结果,需要用await或者回调函数接收返回的文档数据。
正确调用示例
1. async/await 写法(推荐)
// 必须在异步函数内使用await async function getAdminUsers() { // 直接通过Model调用静态方法,await等待查询结果 const adminUsers = await User.findByRole('admin'); console.log(adminUsers); return adminUsers; }
2. 回调函数写法
User.findByRole('user', (err, users) => { if (err) { console.error('查询出错:', err); return; } console.log('普通用户列表:', users); });
可选优化:给静态方法增加参数校验
避免传入非法枚举值导致查询无结果,可以在方法内提前做校验:
userSchema.statics.findByRole = function (role) { // 校验传入的角色是否属于枚举范围 const validRoles = ['user', 'admin']; if (!validRoles.includes(role)) { throw new Error(`角色参数非法,仅支持传入:${validRoles.join('、')}`); } return this.find({ role }); };
排查注意事项
- 传入的
role参数严格区分大小写,必须和枚举定义的小写user、admin完全一致,大写或者拼写错误都会导致查询无匹配结果 - 确认数据库内的用户文档确实存在对应
role值的记录,可直接执行User.find({role: 'admin'})验证数据是否存在
内容的提问来源于stack exchange,提问作者The silent one
相关产品推荐
相关产品推荐

