Node.js向MySQL插入数据提示成功但字段为null、值undefined问题排查
问题原因及修复方案
1. 缺失请求体解析中间件(出现概率最高)
Express v4.16+ 版本默认不自带请求体解析能力,如果你没有在服务入口代码中添加express.json()中间件,request.body会直接返回undefined,实例化Guest模型时所有属性都会被赋值为undefined,插入数据库后就会变成null。
修复方法:在路由注册逻辑前添加解析中间件:
const express = require('express') const app = express() // 新增这行,解析application/json格式的请求体 app.use(express.json()) // 后续再注册你的业务路由 app.use('/xxx', yourRouter)
2. 空请求体校验逻辑错误
你写的Object(request.body).length === 0永远不会成立,普通Object对象本身没有length属性,哪怕是空对象对应的length也是undefined,所以就算请求是空也会进入插入逻辑。同时状态码设置语法错误,response.send(400)要改为response.status(400),重复调用send会触发响应异常。
3. 模型构造函数缺少容错处理
如果传入的guest参数为undefined,直接取guest.firstName等属性就会返回undefined,可以添加默认值兜底:
var Guest = function(guest) { guest = guest || {} this.firstName = guest.firstName || null this.lastName = guest.lastName || null this.mobile = guest.mobile || null this.email = guest.email || null }
4. 控制器错误处理缺少终止逻辑
if(error)分支执行完response.send(error)后没有return,会继续执行后面的response.json,触发「无法在响应已发送后设置响应头」的报错,需要补全终止逻辑:
GuestModel.createGuest(guestRequestData, (error, guest) => { if(error) { return response.send(error); } response.json({status: true, message: 'Guest Created Successfully', data: guest.insertId}) })
5. 数据库字段名不匹配
如果你的guest表列名是下划线命名(比如first_name、last_name)而非驼峰命名,也会导致插入时找不到对应字段,值为null。可以对照数据库表结构,调整模型属性名和列名保持一致。
内容的提问来源于stack exchange,提问作者YukiOno
相关产品推荐
相关产品推荐

