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

node-mysql2查询触发TypeError,求添加错误处理避免应用冻结

解决node-mysql2中因SQL参数为Null/Undefined导致的TypeError错误

错误原因分析

你遇到的TypeError: Cannot read properties of undefined (reading 'constructor')错误,是由于传入mysql2的query方法的sql参数为null或undefined导致的。mysql2内部逻辑直接访问sql.constructor,而null/undefined不存在constructor属性,触发该异常;若未捕获,会导致Node.js进程进入不稳定状态甚至冻结。

一、提前校验:避免错误触发

在调用mysql2的query方法前,添加参数校验逻辑,确保SQL语句和会话变量(AgentID、DealerID等)合法。

1. 封装安全的查询方法

封装一个带校验的查询工具函数,统一处理参数校验和异常捕获:

// 封装带参数校验的安全查询函数
async function safeDbQuery(connection, sql, values = []) {
  // 校验SQL语句是否有效
  if (!sql || typeof sql !== 'string') {
    throw new Error('无效SQL:语句不能为空且必须为字符串');
  }

  // 校验会话变量(示例:检查AgentID、DealerID非空)
  // 根据你的实际参数位置调整校验逻辑
  const requiredParams = values.filter(val => val == null);
  if (requiredParams.length > 0) {
    throw new Error('会话参数缺失:AgentID/DealerID不能为空');
  }

  // 执行查询并捕获异常
  try {
    const [rows] = await connection.query(sql, values);
    return rows;
  } catch (err) {
    console.error('DB查询失败:', err.message);
    throw err; // 重新抛出让上层处理,或返回错误对象
  }
}

2. 避免非法SQL拼接

拼接SQL时,确保最终生成合法字符串,避免因变量为null导致SQL变为undefined:

// 错误示例:agentID为null时sql会变为undefined
// const sql = agentID ? `SELECT * FROM stock WHERE agent_id = ?` : undefined;

// 正确示例:即使agentID为null,也生成合法SQL(或直接终止查询)
let sql, queryValues;
if (agentID == null) {
  throw new Error('AgentID不能为空,无法执行查询');
} else {
  sql = `SELECT * FROM stock WHERE agent_id = ?`;
  queryValues = [agentID];
}

// 使用封装的安全函数执行
await safeDbQuery(connection, sql, queryValues);

二、错误发生时:避免进程冻结

添加全局异常捕获机制,处理未被捕获的同步/异步异常,防止进程挂起:

// 捕获未处理的Promise拒绝(异步异常)
process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理Promise拒绝:', reason.stack || reason);
  // 可添加告警、日志记录,必要时重启进程
  // 若使用PM2等进程管理工具,可调用process.exit(1)让进程自动重启
  process.exit(1);
});

// 捕获未捕获的同步异常
process.on('uncaughtException', (err) => {
  console.error('未捕获同步异常:', err.stack || err);
  // 清理资源(如关闭数据库连接)后退出进程
  connection.end().finally(() => {
    process.exit(1);
  });
});

三、额外建议

  • 尽量使用参数化查询(而非字符串拼接),既避免SQL注入,也减少因变量为null导致的SQL格式错误;
  • 添加日志系统,将所有查询错误记录到文件或日志服务,便于排查问题;
  • 若使用连接池,确保连接池配置了合理的错误重试机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:40:41