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

为何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反而触发了误判。

正确的判断方式应该换成以下几种:

  1. 用Mongoose自带的验证方法检查ID格式有效性:
if (!mongoose.Types.ObjectId.isValid(objectId)) {
  throw new Error('Invalid ObjectId');
}
  1. 判断ObjectId的字符串形式是否为空:
if (!objectId.toString()) {
  throw new Error('Empty ObjectId');
}
  1. 结合实例检查判断是否为有效初始化的ObjectId:
if (!(objectId instanceof mongoose.Types.ObjectId) || !objectId.toString()) {
  throw new Error('Invalid or empty ObjectId');
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:34:57