在JavaScript / Node.js中,SQLite异步查询函数实现

以下是基于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));
*/

功能说明:

  1. 参数化查询 :通过db.all()方法和参数数组实现安全查询
  2. 异步处理:使用Promise和async/await实现异步操作
  3. 连接管理
    • 使用IIFE模式确保数据库正确打开
    • finally块保证始终尝试关闭连接
    • 关闭错误会被记录但不影响主要结果
  4. 错误处理
    • 捕获所有数据库操作错误
    • 查询错误会直接传递给调用方
    • 关闭错误会记录到控制台

使用注意事项:

  1. 需要先安装依赖:npm install sqlite3
  2. 数据库文件需要存在于指定路径
  3. SQL语句需要与参数数组正确匹配
  4. 返回结果为行数组,空查询返回空数组

这个实现确保了在以下情况都能正确关闭连接:

  • 查询成功时
  • 查询失败时
  • 数据库连接建立失败时
  • 任何代码执行路径出现异常时
相关推荐
云枫晖3 小时前
手写Promise-静态方法all和allSettled
前端·javascript
weixin_456904273 小时前
前端开发时npm install报错解决方案
前端·npm·node.js
风继续吹..3 小时前
Express.js 入门指南:从零开始构建 Web 应用
前端·javascript·express
一只小风华~3 小时前
命名视图学习笔记
前端·javascript·vue.js·笔记·学习
小高0073 小时前
🎯GC 不是 “自动的” 吗?为什么还会内存泄漏?深度拆解 V8 回收机制
前端·javascript·面试
RoyLin4 小时前
V8引擎与VM模块
前端·后端·node.js
小白菜学前端4 小时前
Vue 配置代理
前端·javascript·vue.js
m0_zj4 小时前
63.[前端开发-Vue3]Day05-非父子通信-声明周期-refs-混合-额外补充
前端·javascript·vue.js
Async Cipher5 小时前
JSON-LD 的格式
前端·javascript