Express+Mongoose向MongoDB插入POST数据时自定义字段丢失问题
问题原因
自定义字段未写入数据库的核心原因是接口收到的request.body为空对象。调用Mongoose的create方法时传入空对象,Mongoose只会自动生成_id、timestamps配置对应的createdAt/updatedAt、版本键__v,不会写入任何业务字段。
具体问题与修复方法
请求格式/请求头配置错误
首先检查Postman的请求配置:- 请求体选择
raw类型,右侧下拉菜单选中JSON(不要使用form-data、x-www-form-urlencoded等格式),填入你的JSON参数 - 确认请求头自动携带了
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
相关产品推荐
相关产品推荐

