Node.js中使用参数化查询遇解构错误,求解决方法
解决参数化查询中的SyntaxError问题
错误原因及修正点:
- sql2变量声明语法错误:你用逗号运算符将SQL字符串和参数数组绑定赋值给
sql2,这会导致sql2实际指向的是参数数组,而pool.execute需要第一个参数是SQL字符串、第二个是参数数组。 - 未定义的userId变量:方法参数里没有
userId,但插入语句中使用了该变量,会引发ReferenceError。 - genderTypeId变量未正确替换:第一个查询中
genderTypeId='genderTypeId'是字符串字面量,不是变量引用,且存在SQL注入风险。 - 记录存在判断逻辑错误:
rows是结果数组,判断是否为空应使用rows.length < 1,而非直接rows < 1。 - 表名不一致:第一个查询用
hc_servicesdetail,第二个插入用servicesdetail,需确认是否为同一表。
修正后的代码:
static async addServiceDetail(shopId, serviceId, genderTypeId, price, serviceName, userId) { // 使用参数化查询避免SQL注入 const sql = `SELECT id FROM hc_servicesdetail WHERE shopId = ? AND serviceId = ? AND genderTypeId = ?`; const [rows] = await pool.execute(sql, [shopId, serviceId, genderTypeId]); if (rows.length < 1) { const sql2 = `INSERT INTO servicesdetail (userId, serviceId, genderTypeId, price, serviceName) VALUES (?, ?, ?, ?, ?)`; const [datass] = await pool.execute(sql2, [userId, serviceId, genderTypeId, price, serviceName]); console.log('last inserted id is ' + datass.insertId); } else { console.log('already exist'); } }
关键说明:
- 所有查询改用参数化方式,将参数作为
execute的第二个参数传入,彻底避免SQL注入风险。 - 补全
userId作为方法参数,解决变量未定义问题。 - 用
rows.length准确判断查询结果是否为空。
内容的提问来源于stack exchange,提问作者Diana
相关产品推荐
相关产品推荐

