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

为何Express开发CRUD应用时GET请求正常但POST请求无法发送?

问题原因与修复方案

1. 核心问题:缺少Express请求体解析中间件

你当前的Express服务没有配置JSON请求体解析能力,POST/PUT等携带请求体的请求到达服务时,req.body会是undefined,调用Book.create时因缺少title、author等必填字段触发校验报错,这也是GET请求正常、其他请求失败的最主要原因。
修复方法:在app.js中路由挂载前添加解析中间件:

const express = require('express');
const connectDB = require('./config/db');
const books = require('./routes/api/book');

const app = express();

connectDB();

// 新增以下两行解析请求体
app.use(express.json()); // 解析application/json格式的请求体
app.use(express.urlencoded({ extended: true })); // 解析form表单格式的请求体

app.use('/api/books', books);

// 剩余原有代码保持不变

2. 次要问题:模型引入写法不匹配

你在models/Book.js中是直接导出Book实例:

module.exports = Book = mongoose.model('book', BookSchema);

但在路由中使用了解构引入:

const { Book } = require('../../models/Book');

这种写法会导致拿到的Book为undefined,调用方法时直接报错。
二选一修复即可:

  • 方案1:修改models/Book.js的导出逻辑:
    const Book = mongoose.model('book', BookSchema);
    module.exports = { Book };
    
  • 方案2:修改routes/api/book.js的引入逻辑:
    const Book = require('../../models/Book');
    

3. 其他可优化点

  • 路由注释错误:删除接口的注释误写为@route PUT api/books/:id,建议修正为@route DELETE api/books/:id
  • 排查问题时可在catch块中打印完整错误信息,方便定位具体故障:
    catch (error) {
        console.log(error); // 新增打印错误日志
        res.status(400);
        res.json({error: 'Unable to add this book'})
    }
    
  • 调用findByIdAndUpdate时建议添加{new: true}参数,返回更新后的最新数据:
    const book = await Book.findByIdAndUpdate(req.params.id, req.body, {new: true});
    

内容的提问来源于stack exchange,提问作者Nikita Chauhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:57:03