mongod 进程未启动、URI 中特殊字符未编码、db.collection() 库名不匹配是导致“连得上但没数据”的三大主因;需检查 mongod 进程、编码密码、核对库名与权限。

mongod 进程没起来,node 脚本根本连不上
不是代码写错了,是底层服务压根没跑。VSCode 里的 node 只负责发连接请求,它不启动 mongod。
- macOS/Linux 执行
ps aux | grep mongod,看有没有带--dbpath或--port的进程 - Windows 直接打开任务管理器,搜
mongod.exe - 没进程?那就先手动启动:
mongod --dbpath /path/to/data(路径要真实存在) - 如果改过端口(比如用
--port 27018),uri里必须显式写成mongodb://localhost:27018
MongoClient 初始化时漏了 serverApi,本地连得上但远程 Atlas 报错
新版驱动默认启用 Stable API,不配 serverApi 选项,Atlas 会拒绝认证(尤其在 v6+ 驱动下)。
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
- 正确写法:
const client = new MongoClient(uri, { serverApi: { version: ServerApiVersion.v1, strict: true, deprecationErrors: true } }); - 不加这个配置,
await client.connect()可能静默失败或抛出Authentication failed - 本地单机部署可以省略,但只要涉及 Atlas、云托管或未来升级,建议统一加上
密码含 @、/、:,URI 解析直接截断
mongodb:// 是标准 URI,特殊字符不编码 = 连接串被错误切分,user 或 host 字段直接错乱。
- 示例:密码
pa@ss/word:123→ 必须编码为pa%40ss%2Fword%3A123 - 快速编码:浏览器控制台执行
encodeURIComponent('pa@ss/word:123') - 连接字符串开头结尾不能有空格,
mongodb://localhost:27017(末尾空格)也会报Invalid connection string - URI 末尾加数据库名(如
mongodb://localhost:27017/myapp)只影响默认上下文,不影响连接本身
查不到数据,其实是 db.collection() 指向了空库或权限不对
脚本能跑、没报错,但 find() 返回空数组——大概率是集合真不在那个库里,或用户没被授予权限。
- 确认你
client.db('myapp').collection('users')的'myapp'和实际写入数据的库名完全一致(区分大小写) - 如果用 Mongoose 写入,检查它的
mongoose.connect('mongodb://.../targetdb')是否和 Node.js 脚本里用的库名相同 - 权限问题:用
mongosh连上去,执行db.runCommand({connectionStatus: 1}),看authInfo.authenticatedUsers对应的角色是否包含目标库的readWrite - 刚插入文档后立刻查,加
await确保写操作完成;Node.js Driver 默认不等写确认,需显式用insertOne(..., { writeConcern: { w: "majority" } })
@、mongod 进程没起来、或者 db.collection() 名字和实际写入的库对不上——这三个点,占了实操中八成以上的“连得上但没数据”问题。

















