以下是基于Node.js和SQLite的异步函数实现,满足参数化查询、异常安全关闭数据库连接等要求:
1const sqlite3 = require('sqlite3'); 2 3async function queryDatabase(dbName, sql, params) { 4 // 创建数据库连接并等待打开 5 const db = await new Promise((resolve, reject) => { 6 const database = new sqlite3.Database(dbName, (err) => { 7 if (err) return reject(err); 8 resolve(database); 9 }); 10 }); 11 12 try { 13 // 执行参数化查询 14 const results = await new Promise((resolve, reject) => { 15 db.all(sql, params, (err, rows) => { 16 if (err) return reject(err); 17 resolve(rows); 18 }); 19 }); 20 return results; 21 } finally { 22 // 始终尝试关闭数据库连接 23 await new Promise((resolve, reject) => { 24 db.close((err) => { 25 if (err) { 26 console.error('数据库关闭错误:', err.message); 27 reject(err); 28 } else { 29 resolve(); 30 } 31 }); 32 }).catch(() => { /* 已记录错误,无需处理 */ }); 33 } 34} 35 36// 使用示例 37/* 38queryDatabase('mydb.sqlite', 'SELECT * FROM users WHERE id = ?', [1]) 39 .then(results => console.log(results)) 40 .catch(err => console.error('操作失败:', err)); 41*/ 42
功能说明:
- 参数化查询:通过
db.all()方法和参数数组实现安全查询 - 异步处理:使用Promise和async/await实现异步操作
- 连接管理:
- 使用IIFE模式确保数据库正确打开
- finally块保证始终尝试关闭连接
- 关闭错误会被记录但不影响主要结果
- 错误处理:
- 捕获所有数据库操作错误
- 查询错误会直接传递给调用方
- 关闭错误会记录到控制台
使用注意事项:
- 需要先安装依赖:
npm install sqlite3 - 数据库文件需要存在于指定路径
- SQL语句需要与参数数组正确匹配
- 返回结果为行数组,空查询返回空数组
这个实现确保了在以下情况都能正确关闭连接:
- 查询成功时
- 查询失败时
- 数据库连接建立失败时
- 任何代码执行路径出现异常时