You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:48:05