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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:02:35