在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. 返回结果为行数组,空查询返回空数组

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

  • 查询成功时
  • 查询失败时
  • 数据库连接建立失败时
  • 任何代码执行路径出现异常时
相关推荐
孟陬2 小时前
Node.js 测试报告格式一览和自定义 json 格式 `--test-reporter=spec | tap | dot | junit | lcov`
node.js
jarvisuni4 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
破z晓6 小时前
javascript 导出excel表
开发语言·javascript·excel
小罗水7 小时前
第17章 后台管理端与演示支持
javascript·vue.js·ecmascript
万少8 小时前
DeepSeek-V4-Flash 正式版上线了,但这 3 个坑我帮你提前踩了
前端·javascript·后端
宁风NF9 小时前
JavaScript:网络请求与前端通信
开发语言·前端·javascript·网络·学习·ecmascript
吾儿良辰9 小时前
Flutter 迎来重大变革:Material 设计系统拆分,迈向更开放的 UI 框架
javascript·flutter·ui
猫猫不是喵喵.9 小时前
Vue3 中 computed 计算属性与 watch、watchEffect 监听
前端·javascript·vue.js
猫猫不是喵喵.10 小时前
Vue2 的 Vuex 状态管理与 Vue3 的 Pinia 状态管理
前端·javascript·vue.js
看昭奚恤哭11 小时前
Flutter 布局核心思想
开发语言·javascript·flutter