使用Node+Express+MongoDB开发REST API Postman测试报firstName undefined错误
问题根因
报错是因为Express中间件注册顺序错误:你先注册了api路由,之后才注册body-parser解析中间件,导致请求到达POST接口的控制器逻辑时,请求体还没有被解析,req.body为undefined,读取req.body.firstName就触发了对应的报错。
修复步骤
修改服务端配置的代码,调整中间件注册顺序,把body-parser的注册逻辑移到路由注册之前即可:
import Express from "express"; import Mongoose from "mongoose"; import CorsOptions from "cors"; import bodyParser from "body-parser"; import apiRoutes from "./routes/api.js"; const app = Express(); // 调整顺序:先注册解析请求体的中间件,再注册路由 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use("/api", apiRoutes); const CONNECTION_URL = "mongodb+srv://user:Index-123@cluster0.uhijm.mongodb.net/SustainableIQ?retryWrites=true&w=majority"; const PORT = process.env.PORT || 5000; Mongoose.connect(CONNECTION_URL) .then(() => // 这里注意模板字符串要用反引号包裹,才能正确解析${PORT}变量 app.listen(PORT, () => console.log(`server running on port: ${PORT}`)) ) .catch((error) => console.log(error.message));
额外优化建议
- 如果你使用的是Express 4.16及以上版本,不需要单独安装引入
body-parser,直接使用Express内置的express.json()和express.urlencoded()即可,功能完全一致 - 控制器代码中你已经把
req.body作为参数传给了模型构造函数(比如new adminSchema(admin)、new postUser(post)),不需要再单独给每个字段重复赋值,这部分代码可以直接删掉 - 注意
createUser方法里的compnayName拼写错误,正确拼写为companyName,避免后续字段存储异常
内容的提问来源于stack exchange,提问作者hamjeth Misree
相关产品推荐
相关产品推荐

