MongoDB集合无法写入求助:Express+Mongoose后端POST接口报错
无法向MongoDB写入数据的问题修复方案
以下是代码中存在的问题及对应修复方式:
1. 缺少JSON请求体解析中间件
Express默认不解析JSON格式的请求体,导致req.body为undefined,无法获取Postman发送的参数。
修复:在注册路由前添加解析中间件:
// index.js const express = require('express'); const mongoose = require('mongoose'); const dotenv = require("dotenv"); const UserRoute = require("./routes/user"); const app = express(); dotenv.config(); // 添加JSON解析中间件 app.use(express.json()); mongoose.connect(process.env.MONGO_URL, { useNewUrlParser: true }, (err) => { if (err) return console.error("Database connection failed:", err); console.log("Database connected successfully!!"); }); app.use("/register", UserRoute); app.listen(8000, () => console.log("Server connected!!!"));
2. MongoDB连接未处理错误
原代码的连接回调未处理错误,即使数据库连接失败也会打印成功信息,无法排查连接问题。
修复:在回调中添加错误判断(或改用Promise链式调用),如上代码所示。
3. 异步保存操作未使用await
newUser.save()是异步Promise操作,原代码未加await,会导致保存未完成就返回响应,且保存错误无法被catch捕获。
修复:修改routes/user.js中的保存逻辑:
// routes/user.js const User = require("../model/User"); const router = require("express").Router(); router.post("/", async (req, res) => { try { const newUser = new User({ name: req.body.name, age: req.body.age }); // 添加await等待保存完成 const user = await newUser.save(); res.status(200).json({ message: "Account activated", user }); } catch (err) { res.status(400).json(err); } }); module.exports = router;
4. 可选:增强Schema数据验证
为避免空数据写入,可给Schema字段添加必填验证:
// model/User.js const mongoose = require('mongoose'); const UserSchema = new mongoose.Schema({ name: { type: String, required: true // 必填 }, age: { type: Number, required: true // 必填 } }); module.exports = mongoose.model("User", UserSchema);
完成以上修复后,重新启动服务,用Postman发送POST http://localhost:8000/register请求,请求体选择raw -> JSON格式,输入如下内容即可正常写入数据:
{ "name": "test", "age": 25 }
内容的提问来源于stack exchange,提问作者Robert Downey Jr.
相关产品推荐
相关产品推荐

