MongoDB项目在Mac运行报TypeError: Cannot read property 'db' of undefined
问题原因与解决方案
你遇到的跨设备运行异常主要由以下几类原因导致,按排查优先级排序:
- 新设备未启动MongoDB服务:原设备大概率配置了MongoDB开机自启,新设备安装MongoDB后默认不会自启,本地27017端口无服务监听,直接导致连接失败。
- 代码异步逻辑混用导致的兼容问题:你的代码同时对
MongoClient.connect使用了await和回调函数,不符合MongoDB Node.js驱动的调用规范,不同版本的驱动对这种错误写法的兼容度不同,就会出现一台设备正常、另一台报错的情况。 - 新设备MongoDB配置不匹配:包括端口被修改、绑定IP非127.0.0.1、开启了权限验证但代码未携带认证信息、27017端口被其他进程占用、防火墙拦截本地连接等。
- 依赖版本不一致:两台设备安装的MongoDB Node.js驱动版本不同,部分版本存在API兼容性差异。
修复步骤
1. 先排查MongoDB服务状态
在新Mac的终端执行以下命令:
# 查看MongoDB服务运行状态,用brew安装的服务名称为mongodb-community brew services list
如果状态不是started,执行启动命令:
brew services start mongodb-community
启动完成后执行命令测试本地连接:
mongosh --host 127.0.0.1 --port 27017
如果能正常进入MongoDB shell则服务正常,否则继续排查配置问题。
2. 修正代码异步逻辑
移除MongoClient.connect的回调参数,统一用async/await写法,同时修正ngrok配置中端口变量不一致的问题:
async function start() { app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); }); try { // 仅用await获取连接实例,不传入回调 const client = await MongoClient.connect( 'mongodb://127.0.0.1:27017', { useUnifiedTopology: true, useNewUrlParser: true } ); const dbase = client.db('Server'); console.log('connected!'); /* dbase.createCollection('posts') */ } catch (e) { console.log('Server error', e.message); process.exit(1); } ngrok.connect( { proto: 'http', addr: PORT, // 统一使用代码中定义的PORT变量,避免和process.env.PORT不一致 }, (err, url) => { if (err) { console.error('Error while connecting Ngrok', err); return new Error('Ngrok Failed'); } } ); } start();
3. 其他兼容问题排查
- 确认两台设备的MongoDB驱动版本一致,执行
npm list mongodb查看版本,存在差异的话执行npm i mongodb@<原设备版本号>统一版本,避免使用有Breaking Change的大版本。 - 检查新设备MongoDB配置文件:苹果芯片Mac默认路径为
/opt/homebrew/etc/mongod.conf,Intel芯片Mac默认路径为/usr/local/etc/mongod.conf,确认net配置项中bindIp为127.0.0.1、port为27017,如果security配置项中开启了authorization: enabled,需要在连接串中补充用户名密码,格式为mongodb://<用户名>:<密码>@127.0.0.1:27017。 - 执行
lsof -i :27017查看27017端口是否被其他进程占用,如有占用可修改MongoDB端口或者结束占用进程。
内容的提问来源于stack exchange,提问作者Tathevik Hayrapetyan
相关产品推荐
相关产品推荐

