使用mysql2连接AWS Aurora DB报错:TypeError: (intermediate value)不可迭代
我当前使用mysql2连接AWS Aurora数据库,但无法连接集群或获取任何记录。代码如下:
connection = createConnection({ host: 'music-instance-2.cairvpszramp.us-east-1.rds.amazonaws.com', user: 'user', password: 'password', database: 'music' }); console.log("Before Connection") const [rows, fields] = await connection.execute('USE Music;SELECT * FROM artist;'); console.log("After Connection") return { statusCode: 200, body: JSON.stringify(rows) };
运行时持续抛出以下错误:
Error Caught TypeError: (intermediate value) is not iterable at Runtime. (/var/task/index.js:27:36) at Generator.next () at fulfilled (/var/task/index.js:5:58)
环境说明
- 使用TypeScript,代码运行在Node.js 18版本的AWS Lambda函数中。
console.log(data)输出如下:
_events: [Object: null prototype] {},_eventsCount: 0,
_maxListeners: undefined, next: null, statement: undefined, sql: 'USE Music;SELECT * FROM artist;', values: undefined, onResult: undefined,
parameters: undefined, insertId: 0,timeout: undefined, queryTimeout:
null,
_rows: [],
_fields: [],
_result: [],
_fieldCount: 0,
_rowParser: null,
_executeOptions: { sql: 'USE Music;SELECT * FROM artist;', values: undefined },
_resultIndex: 0,
_localStream: null,
_unpipeStream: [Function (anonymous)],
_streamFactory: undefined,
_connection: null, [Symbol(kCapture)]: false
错误含义
这个错误表示你尝试对一个不可迭代的值使用数组解构(const [rows, fields] = ...)。mysql2的execute方法执行多语句(你这里写了USE Music;SELECT * FROM artist;两条SQL)时,默认不会返回可解构的[rows, fields]数组,而是返回一个查询对象(从你console.log的输出也能看到,是包含_rows、_fields等属性的对象),所以解构操作会失败。
修复方案
1. 移除多余的USE语句,简化查询
你已经在连接配置里指定了database: 'music',不需要再执行USE Music;,直接执行查询语句即可:
const [rows, fields] = await connection.execute('SELECT * FROM artist;');
2. 若需执行多语句,开启多语句支持并正确解构
如果必须执行多条SQL语句,需要先在连接配置中开启multipleStatements: true,然后对多语句的返回结果做对应解构:
// 修改连接配置 connection = createConnection({ host: 'music-instance-2.cairvpszramp.us-east-1.rds.amazonaws.com', user: 'user', password: 'password', database: 'music', multipleStatements: true // 开启多语句支持 }); // 执行多语句并解构结果:第一个语句是USE,无有效返回;第二个是查询结果 const [[_, __], [rows, fields]] = await connection.execute('USE Music;SELECT * FROM artist;');
3. 额外排查项
- 确认AWS Lambda的安全组允许访问Aurora集群的3306端口(默认MySQL端口);
- 检查Aurora的访问控制列表是否包含Lambda所在VPC的权限或IP范围;
- 保持数据库名大小写一致:连接配置里是小写
music,SQL里是大写Music,虽然MySQL默认不区分大小写,但尽量统一避免潜在问题。
内容的提问来源于stack exchange,提问作者Karim Fayed

