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

如何为JavaScript中Inquirer.prompt的答案创建函数参数?含MySQL

解决你的SQL参数传递与注入问题

我明白你想让addToTable函数更灵活易用,但当前代码有两个关键问题需要修正:一是你传递的是字符串字面量"data.department_name"而非实际用户输入值,二是直接拼接SQL语句存在严重的SQL注入风险。下面是修复后的方案:

核心问题分析

你当前调用addToTable("department_name" , "data.department_name" , "department", "name" )时,第二个参数是字符串"data.department_name",所以SQL语句会直接插入这个字符串,而不是用户输入的部门名称。另外,直接拼接用户输入到SQL里是非常危险的操作,恶意用户可以通过输入特殊字符篡改你的数据库。

修复后的代码

我们可以利用MySQL的参数化查询(占位符?)来安全传递值,同时动态获取用户输入:

function addToTable(prompt_name, table_name, table_col) {
  inquirer.prompt([
    { 
      type: "input", 
      name: prompt_name, 
      message: `Type the ${prompt_name}?` 
    }
  ]).then(function(data) {
    // 使用参数化查询,?是占位符,值放在数组里传递
    const query = `INSERT INTO ${table_name} (${table_col}) VALUES (?)`;
    connection.query(query, [data[prompt_name]], function(err, res) {
      if (err) throw err;
      console.log(`Successfully added ${data[prompt_name]} to ${table_name}!`);
    });
  });
};

// 调用方式:只需要传入提示名称、表名、列名
addToTable("department_name", "department", "name");

关键改进点

  • 移除冗余的prompt_answer参数:通过data[prompt_name]动态获取用户输入的值,因为prompt_name就是你定义的输入字段name属性,这样更灵活。
  • 使用参数化查询:用?作为值的占位符,把用户输入的值放在数组里作为connection.query的第二个参数,MySQL会自动处理转义,彻底避免SQL注入。
  • 模板字符串优化:用ES6模板字符串代替字符串拼接,让代码更易读。

这样修改后,你的函数不仅能正确传递用户输入的变量值,还能保证数据库操作的安全性,同时保持了函数的易用性。

内容的提问来源于stack exchange,提问作者Mr. Dawit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:30:54