Express+Mongoose存Todo文档报错:Cannot read property 'text' of undefined
解决Express中
Cannot read property 'text' of undefined错误 这个错误的核心原因很明确:你的Express应用没有配置JSON请求体解析中间件,导致req.body是undefined,所以读取req.body.text时就会抛出这个类型错误。
步骤1:添加Express JSON解析中间件
在你的Express主入口文件(比如app.js或server.js)中,必须先添加以下中间件,才能让Express解析JSON格式的请求体:
const express = require('express'); const app = express(); // 关键:启用JSON请求体解析,处理Content-Type为application/json的请求 app.use(express.json()); // 之后再挂载你的路由 app.use('/your-route-prefix', require('./router/todoroute'));
步骤2:检查Postman的请求配置
确保你在Postman中发送请求时满足以下条件:
- 请求方法选择
POST - 请求头中添加
Content-Type: application/json - Body选项选择
raw,格式切换为JSON,输入正确的JSON内容,例如:{ "text": "完成这个待办事项" }
额外优化建议
简化代码逻辑
你的Schema中date字段已经设置了default: Date.now,所以创建Todo时不需要手动传入date,可以简化路由代码:
router.post('/addtodo', (req, res) => { // 直接传入text即可,date会自动使用默认值 Todos.addTodo({ text: req.body.text }, (err, todo) => { if(err) { // 不要直接throw err,应该返回友好的错误响应 return res.status(500).json({ error: err.message }); } res.json(todo); }); });
优化Model方法
其实addTodo方法可以更简洁,因为mongoose.Model.create本身就可以直接接收对象,不需要先实例化:
// 替换原有的addTodo方法 module.exports.addTodo = (todoData, callback) => { Todos.create(todoData, callback); };
内容的提问来源于stack exchange,提问作者Shahaji
相关产品推荐
相关产品推荐

