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

Express+Mongoose向MongoDB插入POST数据时自定义字段丢失问题

问题原因

自定义字段未写入数据库的核心原因是接口收到的request.body为空对象。调用Mongoose的create方法时传入空对象,Mongoose只会自动生成_id、timestamps配置对应的createdAt/updatedAt、版本键__v,不会写入任何业务字段。

具体问题与修复方法

  • 请求格式/请求头配置错误

    首先检查Postman的请求配置:
    1. 请求体选择raw类型,右侧下拉菜单选中JSON(不要使用form-data、x-www-form-urlencoded等格式),填入你的JSON参数
    2. 确认请求头自动携带了Content-Type: application/json,不要修改这个头的取值
      你可以在/add接口回调的第一行加console.log(request.body)打印日志,发起请求后看Node服务控制台,如果输出是{}就说明请求体没有被正确解析。
  • Express中间件挂载顺序错误

    你当前app.js里的中间件顺序不符合Express的执行逻辑:404处理中间件放在了根路由前面,会导致/路径的请求直接返回404,永远到不了后面写的根路由处理器;另外根路由里的方法调用错误,request对象不存在send方法,需要调用response对象的方法。
    调整后的中间件/路由挂载顺序参考如下:
    // 优先挂载全局解析、跨域中间件
    app.use(express.static(__dirname));
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());
    app.use(cors());
    
    // 挂载所有业务路由
    const apirequestlogRoute = require('./models/common/logs/apirequests/apirequestlogRoutes');
    app.use('/apirequestlogs', apirequestlogRoute);
    app.get('/', (request, response) => {
        response.send('Invalid Request'); 
    });
    
    // 所有路由之后挂载404、全局错误处理中间件
    app.use((request, response, next) => {
        next(createError(404));
    });
    app.use(function(error, request, response, next){
        if(!error.statusCode) error.statusCode = 500;
        response.status(error.statusCode).send(error.message);
    });
    
  • 路由文件存在冗余代码

    apirequestlogRoutes.js第一行的const app = express();没有被任何逻辑使用,属于无效代码,直接删除即可,避免后续维护产生误解。

验证

修复后重新发起POST请求,先确认控制台打印的request.body包含所有传入的业务字段,此时接口返回值、MongoDB中存储的记录都会正常携带nid、host等自定义字段。

内容的提问来源于stack exchange,提问作者Naveed Naik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:01:06