NodeJS实现MySQL多组重量/包裹类型的收入求和查询方案咨询
解决多行包裹收入查询及求和问题
1. 前端表单调整:提交数组格式数据
修改表单中下拉框的name属性,让数据以数组形式提交,确保后端能接收多行对应的数据:
<!-- 每一行的重量选择框 --> <select name="weight[]" class="weight-input"> <!-- 重量选项 --> </select> <!-- 每一行的包裹类型选择框 --> <select name="parceltype[]" class="type-input"> <!-- 类型选项 --> </select>
提交后,后端可通过req.body.weight和req.body.parceltype获取两个长度一致的数组,每个元素对应一行的重量与类型。
2. 后端接收并校验数据
在Node.js路由中先获取并校验提交的数据:
// 以Express框架为例,获取表单数据 const weights = req.body.weight || []; const parcelTypes = req.body.parceltype || []; // 校验规则:最多5行,且重量与类型数组长度匹配 if (weights.length > 5 || weights.length !== parcelTypes.length) { return res.status(400).send("最多支持5行数据,且每行重量与类型需一一对应"); }
3. 批量查询数据库并计算总和
不要循环逐行查询(效率低且易出问题),改用批量条件查询,同时用参数化查询避免SQL注入:
// 构造批量查询条件:(weight = ? AND type = ?) OR ... const conditionStr = weights.map((_, idx) => "(weight = ? AND type = ?)").join(" OR "); const sql = `SELECT Revenue FROM revenuecard WHERE ${conditionStr}`; // 整理参数数组:按顺序放入每行的重量和类型 const queryParams = []; for (let i = 0; i < weights.length; i++) { queryParams.push(weights[i], parcelTypes[i]); } // 执行查询并计算总和 con1.query(sql, queryParams, function (err, data) { if (err) throw err; let totalRevenue = 0; data.forEach(item => { // 处理可能的空值,确保求和不出错 totalRevenue += parseFloat(item.Revenue) || 0; }); // 将总和传给结果页面模板 res.render("result-page", { revenue: totalRevenue }); });
注:你原代码中JSON.stringify(revenue)是错误写法,查询结果data是包含多行数据的数组,需从每个item.Revenue中取值。
4. 页面显示总和
保持原HTML显示代码即可,现在模板接收的revenue已经是多行收入的总和:
<label style="text-align:right; padding-right:25px;" id="revenue" class="revenue"> <%= revenue %> </label>
额外注意点
- SQL注入防护:必须用参数化查询(代码中的
?占位符),绝对不要直接拼接SQL字符串。 - 前端限制:可在添加行的JS逻辑中限制最多添加5行,减少后端校验压力。
- 异常处理:如果某行的重量/类型在数据库中无匹配数据,要通过
|| 0确保求和时不会出现NaN。
内容的提问来源于stack exchange,提问作者Icing
相关产品推荐
相关产品推荐

