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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:08:13