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