Node.js Express插入SQL Server时NetValue非空约束报错求助
排查req.body字段为null的解决方案
确认Express请求体解析中间件已配置
必须在路由注册前添加解析中间件,否则req.body会是空对象:// 解析普通表单提交的application/x-www-form-urlencoded格式数据 app.use(express.urlencoded({ extended: true })); // 若前端用AJAX提交JSON数据,需额外添加以下配置 app.use(express.json());核对表单name属性与req.body字段名完全匹配
EJS表单输入框的name属性必须和代码中req.body.xxx的xxx完全一致,包括大小写、下划线:
比如EJS代码:<input type="text" name="supplieruid" /> <input type="number" name="NetValue" />后端就必须用
req.body.supplieruid和req.body.NetValue,大小写或拼写错误都会导致拿到null。检查表单提交方式和enctype
表单必须用POST方法提交,enctype默认application/x-www-form-urlencoded即可(不要随意改成multipart/form-data,除非涉及文件上传,否则普通解析中间件无法读取数据):<form method="POST" action="/your-insert-route"> <!-- 表单输入项 --> </form>打印req.body验证数据是否接收
在控制器代码开头加日志,确认后端是否收到前端传的数据:console.log('请求体内容:', req.body);如果控制台输出里没有
supplieruid、NetValue等字段,说明前端未正确传递数据;如果有字段但值为空,检查前端输入是否正常。检查SQL参数绑定是否正确
确保参数化查询的占位符与req.body字段对应,以mssql模块为例:const sql = require('mssql'); // ... 数据库连接池配置 async function insertData(req, res) { try { const pool = await sql.connect(config); const result = await pool.request() .input('supplieruid', sql.VarChar, req.body.supplieruid) .input('resource', sql.VarChar, req.body.resource) .input('taskid', sql.Int, req.body.taskid) .input('NetValue', sql.Decimal(18,2), req.body.NetValue) .input('company', sql.VarChar, '固定值') .query(`INSERT INTO YourTable (supplieruid, resource, taskid, NetValue, company) VALUES (@supplieruid, @resource, @taskid, @NetValue, @company)`); res.send('插入成功'); } catch (err) { console.error(err); res.status(500).send('插入失败'); } }需保证
input的第一个参数(占位符名称)与SQL中的@xxx完全一致,第二个参数的SQL类型与数据库字段类型匹配,第三个参数为正确的req.body字段。
如果以上步骤排查后仍未解决问题,建议贴出完整的控制器代码和EJS表单关键部分,方便进一步定位。
内容的提问来源于stack exchange,提问作者Marilina
相关产品推荐
相关产品推荐

