Node.js使用原生MongoDB驱动执行insertMany时报Cannot read property 'n'错误
问题根源
你本地安装的MongoDB Node.js原生驱动版本和课程使用的版本不一致,课程用的是v3.x及更早版本,你的版本是v4.0+,该版本对insertMany的返回值结构做了不兼容更新:
- v3.x版本中
insertMany回调的result对象包含result子属性(可读取n字段获取插入条数)、ops属性(可读取插入的文档数组) - v4.0+版本直接移除了
result子属性,插入条数对应顶层的insertedCount字段,插入的文档ID对应顶层的insertedIds对象,不存在ops属性,所以访问result.result.n时会因为result.result为undefined抛出报错。
修复方案
方案1:修改代码适配新版本驱动
把insertDocuments方法里的两行断言修改为:
assert.equal(err, null); // 校验插入条数为3 assert.equal(3, result.insertedCount); // 校验插入的ID数量为3,不需要的话可以删除该行 assert.equal(3, Object.keys(result.insertedIds).length);
修改后执行node app.js即可正常输出目标日志。
如果启动时出现拓扑相关的警告,可以在创建MongoClient时新增useUnifiedTopology: true参数:
const client = new MongoClient(url, { useNewUrlParser: true, useUnifiedTopology: true });
方案2:降级驱动版本和课程保持一致
执行以下命令重装v3版本的MongoDB驱动:npm uninstall mongodb && npm install mongodb@3
无需修改原有代码,直接运行项目即可正常执行。
内容的提问来源于stack exchange,提问作者user16548463
相关产品推荐
相关产品推荐

