Node.js使用MongoDB Atlas插入数据返回200状态码但数据未写入问题求助
问题排查与解决方案
为什么注释掉userTea.save()后有响应但数据无法插入
new Tea(req.body)仅会在本地内存中创建符合Schema规则的Mongoose文档实例,不会和MongoDB数据库产生任何交互。save()是Mongoose提供的触发数据库写入的核心方法,注释后自然不会执行插入操作,你接口返回的只是本地临时生成的文档对象,并未持久化到数据库。
调用save()时插入失败的问题排查
- 1. 数据库连接串配置错误
你当前的MongoDB连接串中密码位写的是占位符<test>,需要替换为你MongoDB Atlas中test用户对应的真实密码,且不需要保留尖括号,例如密码为abc123时,连接串对应部分改为test:abc123@firstcluster.g9kk1.mongodb.net/...。 - 2. 数据库连接错误捕获逻辑错误
mongoose.connect是异步方法,你外层的同步try/catch无法捕获异步抛出的连接错误,且连接回调的参数写错了,第一个参数为错误对象,你写的(req, res)会导致无法识别连接报错,哪怕连接失败也会误打印连接成功。 - 3. 错误日志未打印,无法定位写入问题
接口的catch块中console.log()没有传入error参数,导致你看不到具体的写入报错(比如Schema校验失败、数据库权限不足等),自然无法定位问题。 - 4. 重复的请求体解析中间件冲突
Express 4.16+已经内置了express.json()和express.urlencoded()请求体解析能力,你同时引入body-parser的同功能中间件,可能会导致请求体解析异常,拿不到req.body的值。 - 5. Postman请求格式错误
需要确认Postman请求的Body选项卡选择的是raw->JSON格式,且传递的参数包含必填的name字段,否则Schema校验会直接失败。 - 6. MongoDB Atlas权限配置问题
需要确认你Atlas账号中,当前使用的test用户拥有对应glocoach数据库的读写权限,且IP白名单已经添加了你当前设备的公网IP,否则会被Atlas拦截访问请求。
修复后的代码示例
index.js
const express = require('express'); const mongoose = require('mongoose'); require('dotenv/config'); const Tea = require('./models/tea') const app = express(); // 内置请求体解析,无需引入body-parser app.use(express.json()); app.use(express.urlencoded({ extended: true })); // 替换连接串中的<你的真实密码>为Atlas test用户的实际密码 mongoose.connect("mongodb+srv://test:<你的真实密码>@firstcluster.g9kk1.mongodb.net/glocoach?retryWrites=true&w=majority", { useNewUrlParser: true, useUnifiedTopology: true, }, (err) => { if(err) { console.log("数据库连接失败:", err); return } console.log("数据库连接成功!!"); }); app.post('/login', async (req, res)=> { try{ const userTea = new Tea(req.body); await userTea.save(); res.send(userTea); }catch(error){ // 打印错误方便排查 console.log('写入错误:', error); res.status(400).send({ message : error.message }) } }) app.listen(3000, ()=> { console.log("服务已启动,监听3000端口"); });
内容的提问来源于stack exchange,提问作者Rakesh Saini
相关产品推荐
相关产品推荐

