Express.js配置body-parser后req.body仍为undefined的问题
问题解决:req.body undefined 且请求数据未存入数据库
核心问题分析
- 请求体解析中间件未生效:你在控制器文件中新建了独立的Express实例并注册body-parser,但实际运行的服务是
index.js里创建的Express实例,导致解析请求体的中间件完全没作用。 - 模型实例创建错误:控制器中
project.save()的project变量未定义,也没有用请求体数据创建Projects模型的实例,直接调用save会生成空数据条目。
具体修改步骤
1. 迁移请求体解析逻辑到index.js
Express 4.16+已内置body-parser功能,无需单独依赖,直接在index.js中添加解析中间件:
require('dotenv').config() const express = require('express'); const {MongoConnect} = require("./config") const app = express(); const port = process.env.MONGO_PORT; const cors = require("cors"); // Middleware setup app.use(cors()); // 用Express内置方法解析JSON和表单数据 app.use(express.json()); app.use(express.urlencoded({ extended: false })); MongoConnect().then(()=>console.log("MongoDB connected")); const userRouterProjects = require('./routes/Projects') app.use("/api",userRouterProjects); app.listen(port,()=>console.log(`Server is running on port ${port}`));
同时删除控制器文件中多余的Express实例和body-parser注册代码。
2. 修复控制器的创建项目逻辑
修改handleCreateProject函数,正确创建模型实例并传入请求体数据:
const Projects = require("../models/Projects"); // Route handlers const handleCreateProject = async (req, res) => { try { console.log("req.body", req.body); // 用请求体数据创建Projects模型实例 const project = new Projects(req.body); const result = await project.save(); res.status(201).send(result); console.log("Project successfully added"); } catch (error) { console.error("Error saving project:", error); res.status(500).send({ error: "Failed to save project" }); } }; const handleGetAllProjects = async (req, res) => { try { const projects = await Projects.find({}); if (projects.length > 0) { res.send(projects); } else { res.send({ result: "No projects found" }); } } catch (error) { console.error("Error fetching projects:", error); res.status(500).send({ error: "Failed to fetch projects" }); } }; module.exports = { handleCreateProject, handleGetAllProjects, };
3. 验证修改效果
重启服务后,用Postman发送POST请求(确保Content-Type: application/json),此时req.body能正常获取到数据,数据库中也会正确存入name和description字段。
内容的提问来源于stack exchange,提问作者Sahil Kumar
相关产品推荐
相关产品推荐

