NodeJS后端基于mssql包向SQL Server表提交POST数据时插入NULL值问题求助
解决NodeJS + mssql POST插入NULL值的问题
看起来你遇到的问题很典型:POST请求返回201状态码,但SQL Server里只插入了NULL值,而GET请求一切正常。这通常是请求体没有正确解析或者数据字段映射不匹配导致的,我帮你梳理几个排查和修复的步骤:
1. 验证Postman请求格式是否正确
首先确认你在Postman里发送的POST请求符合要求:
- 在
Headers标签里添加Content-Type: application/json,这是让body-parser正确解析JSON请求体的关键; - 在
Body标签里选择raw,然后格式选JSON,输入的JSON字段名要和你代码里使用的完全一致(比如用shop_order而不是驼峰式的shopOrder),示例JSON应该是这样的:
{ "shop_order": "SO12345", "item_number": "ITEM001", "item_desc": "Sample Item", "machine": "NOR1", "supplier": "Supplier A", "feet_coil": "1000", "Date_on": "2024-05-20", "load_no": "LOAD001", "loadpc_signoff": "Yes", "pc_staff_load": "John", "unloadpc_signoff": "No", "pc_staff_unload": "Jane", "Date_off": "2024-05-21", "ctms_id": "CTMS001", "complete": "No" }
2. 添加调试日志确认数据流向
在代码里加入日志,看看请求体是否被正确接收和传递:
在api.js的POST路由中添加日志:
router.route('/ctms').post((request, response) => { // 打印接收到的请求体,确认数据是否正确 console.log('Received request body:', request.body); let ctms = { ...request.body } Db.addCtms(ctms).then(result => { response.status(201).json(result); }) })
在dboperations.js的addCtms函数中添加日志:
async function addCtms(ctms) { // 打印传入的ctms对象,确认属性值是否存在 console.log('Ctms object to insert:', ctms); try { let pool = await sql.connect(config); let insertCtms = await pool.request() // ... 原有input和query代码 return insertCtms.recordsets; } catch (err) { console.log(err); } }
运行代码后发送请求,如果日志里显示request.body是空对象或者属性值都是undefined,说明请求体没有被正确解析,回到第一步检查Postman的请求格式;如果ctms对象的属性值是正确的,但插入后还是NULL,那就要检查SQL参数映射。
3. 确保SQL参数与请求字段完全匹配
检查dboperations.js中addCtms函数的参数映射:
- 确认
.input()的第一个参数(参数名)和INSERT语句里的@参数名完全一致; - 确认每个参数对应的
ctms.xxx属性名和请求体里的字段名完全一致,比如ctms.shop_order对应请求体里的shop_order字段,不能有拼写错误(比如把feet_coil写成feetcoil)。
4. 可选:使用Ctms类构造实例增强数据校验
你已经定义了Ctms类,可以用它来构造实例,确保属性名和类型的一致性,同时也能更清晰地处理自增的UNIQUE_ID(因为它是自动生成的,不需要传入):
修改api.js的POST路由:
router.route('/ctms').post((request, response) => { console.log('Received request body:', request.body); // 解构请求体字段,确保和Ctms类的参数对应 const { shop_order, item_number, item_desc, machine, supplier, feet_coil, Date_on, load_no, loadpc_signoff, pc_staff_load, unloadpc_signoff, pc_staff_unload, Date_off, ctms_id, complete } = request.body; // UNIQUE_ID传null,因为数据库是自增的 let ctms = new Ctms( null, shop_order, item_number, item_desc, machine, supplier, feet_coil, Date_on, load_no, loadpc_signoff, pc_staff_load, unloadpc_signoff, pc_staff_unload, Date_off, ctms_id, complete ); Db.addCtms(ctms).then(result => { response.status(201).json(result); }) })
这样如果请求体里缺少某个字段,解构后对应的变量会是undefined,日志里能立刻发现问题。
5. 检查数据库列的允许NULL设置
虽然你的表定义里所有列(除了UNIQUE_ID)都允许NULL,但如果预期是要插入非NULL值,也可以在代码里添加字段校验,比如在POST路由里检查必填字段是否存在,避免插入空数据。
按照这些步骤排查,应该能找到问题所在,大部分情况下都是请求体格式不对或者字段名不匹配导致的。
内容的提问来源于stack exchange,提问作者Glenn94
相关产品推荐
相关产品推荐

