为何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
相关产品推荐
相关产品推荐

