Express自定义中间件req.body未定义及Mongoose默认值失效求助
问题解决:Express中间件中req.body未定义及Mongoose默认值不生效问题
核心问题1:中间件参数顺序错误
你的自定义中间件bookPictureUrl参数顺序写反了,Express中间件的标准参数顺序是(req, res, next),你写成了(res, req, next),导致中间件里访问的req实际是响应对象res,自然拿不到req.body。
核心问题2:Mongoose默认值触发逻辑(补充说明)
Mongoose的字段默认值仅在字段**未被传入(值为undefined)**时生效,空字符串""属于有效输入值,所以不会触发默认值,你用中间件处理的思路是正确的。
解决方案步骤
1. 修正中间件参数顺序
修改pictureU.js中的中间件代码:
// 无需引入app,此处未使用 const bookPictureUrl = (req, res, next) => { console.log({ body: req.body }); // 覆盖空字符串或undefined的情况 if (!req.body.pictureUrl || req.body.pictureUrl.trim() === '') { req.body.pictureUrl = 'images/default'; } next(); }; module.exports = { bookPictureUrl };
2. 确认请求体解析中间件配置
确保你的app.js中已经配置了Express的请求体解析中间件,否则req.body会始终为undefined(你提到路由中能正常访问,大概率已配置,但仍需确认):
const express = require('express'); const app = express(); // 解析表单格式的请求体 app.use(express.urlencoded({ extended: true })); // 解析JSON格式的请求体(如果需要处理JSON请求) app.use(express.json());
3. 测试验证
重启服务器后,发送包含空字符串pictureUrl的POST请求,中间件会自动将其替换为images/default,再执行后续的数据库更新逻辑。
内容的提问来源于stack exchange,提问作者Carlos Sosa
相关产品推荐
相关产品推荐

