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

Node.js中Socket.emit数据无法正确插入数据库的问题

问题原因

你写的SQL语句中,'data.sender'这类写法是把字符串字面量传递给数据库,单引号会将内部内容当作普通文本处理,因此数据库直接存储了data.sender这个字符串,而不是变量data.sender对应的实际数值。

解决方案

方案1:模板字符串拼接(不推荐用于生产环境)

使用ES6模板字符串(反引号包裹),通过${}语法插入变量值:

socket.on("chat message", (data) => {
  // 注意:data中的字段是category,对应数据库的category_id字段
  var sql = `INSERT INTO tbl_user_chats (sender,receiver,message,created_at,ad_id,category_id) 
             VALUES (${data.sender}, ${data.receiver}, '${data.message}', ${data.date}, ${data.ad_id}, ${data.category})`;
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("1 record inserted");
  });
})

⚠️ 风险提示:这种直接拼接字符串的方式存在SQL注入漏洞,若用户输入的message包含特殊字符(如单引号),会导致SQL语法错误,甚至被恶意攻击,仅适合测试场景。

方案2:参数化查询(推荐,安全可靠)

大多数数据库驱动(如mysql)支持参数化查询,通过占位符传递变量,驱动会自动处理转义,彻底避免SQL注入:

socket.on("chat message", (data) => {
  var sql = "INSERT INTO tbl_user_chats (sender,receiver,message,created_at,ad_id,category_id) VALUES (?, ?, ?, ?, ?, ?)";
  // 按SQL占位符顺序准备参数数组,注意字段对应关系
  var values = [data.sender, data.receiver, data.message, data.date, data.ad_id, data.category];
  
  con.query(sql, values, function (err, result) {
    if (err) throw err;
    console.log("1 record inserted");
  });
})

这是生产环境的标准写法,既能正确传递变量值,又能保障数据安全。

额外注意:你的data对象中字段名为category,但数据库表字段是category_id,需确保参数对应正确。

内容的提问来源于stack exchange,提问作者mark_zuckerberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:30:55