为何Lodash判定Mongoose ObjectId为空?此前无此问题
问题分析:Lodash _.isEmpty 误判 Mongoose ObjectId 为空
问题场景
执行以下代码时触发错误,此前运行正常,如今_.isEmpty判定ObjectId为空并抛出错误,疑惑是否是Lodash的版本变化导致:
const objectId = new mongoose.Types.ObjectId('id would go here'); if (_.isEmpty(objectId)) { throw new Error('this throws an error'); }
原因及解决方案
这不是Lodash的版本变化导致的问题,核心原因是Lodash _.isEmpty的判断逻辑和Mongoose ObjectId的结构特性不匹配:
_.isEmpty检查对象时,会统计其可枚举自有属性的数量,但Mongoose的ObjectId实例的核心属性(比如存储ID字符串的_str)是不可枚举的,所以_.isEmpty会误判它为空对象,返回true。- 之前代码能正常运行,大概率是当时的ObjectId未正确初始化(比如传入了空字符串生成无效ID),或者旧版Mongoose的ObjectId结构有可枚举属性,但现在初始化了有效ID反而触发了误判。
正确的判断方式应该换成以下几种:
- 用Mongoose自带的验证方法检查ID格式有效性:
if (!mongoose.Types.ObjectId.isValid(objectId)) { throw new Error('Invalid ObjectId'); }
- 判断ObjectId的字符串形式是否为空:
if (!objectId.toString()) { throw new Error('Empty ObjectId'); }
- 结合实例检查判断是否为有效初始化的ObjectId:
if (!(objectId instanceof mongoose.Types.ObjectId) || !objectId.toString()) { throw new Error('Invalid or empty ObjectId'); }
内容的提问来源于stack exchange,提问作者superand12
相关产品推荐
相关产品推荐

