使用TypeScript+mysql2时connection.query()参数数量错误求助
解决mysql2 Promise版query在TypeScript中「Expected 1-2 arguments but got 3」错误
核心原因
mysql2的Promise封装版connection.query()仅支持1-2个参数(SQL语句 + 可选的参数数组/对象),而你可能沿用了回调版query的3参数写法(SQL、参数、回调函数),导致TypeScript类型检查报错。
正确写法示例
1. 基础查询(无参数)
const [rows] = await connection.query('SELECT * FROM users');
2. 带占位符参数的查询
使用数组传递参数(支持?占位符):
const [rows] = await connection.query('SELECT * FROM users WHERE id = ?', [123]);
使用对象传递命名参数:
const [rows] = await connection.query('SELECT * FROM users WHERE id = :id', { id: 123 });
3. 使用execute(预编译查询,更安全)
如果需要预编译支持,改用execute方法,参数格式与query一致:
const [rows] = await connection.execute('SELECT * FROM users WHERE id = ?', [123]);
自定义返回类型
为了获得更准确的TypeScript类型提示,可以手动指定泛型:
interface User { id: number; name: string; email: string; } const [rows] = await connection.query<User[]>('SELECT id, name, email FROM users');
Next.js 14环境注意事项
在Server Components中使用时,确保通过mysql2/promise创建连接,避免混用回调版API:
import { createConnection } from 'mysql2/promise'; async function getUserById(userId: number) { const connection = await createConnection({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME }); try { const [rows] = await connection.query<User[]>('SELECT * FROM users WHERE id = ?', [userId]); return rows[0]; } finally { await connection.end(); } }
内容的提问来源于stack exchange,提问作者Dennis Jorgenson
相关产品推荐
相关产品推荐

