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

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

  • 查询成功时
  • 查询失败时
  • 数据库连接建立失败时
  • 任何代码执行路径出现异常时
相关推荐
傻瓜搬砖人14 分钟前
SpringMVC的请求
java·前端·javascript·spring
木易 士心21 分钟前
为什么 Promise 比 setTimeout 先执行?——JavaScript 事件循环与异步顺序完全指南
开发语言·javascript·ecmascript
爱上好庆祝28 分钟前
学习js的第六天(js基础的结束)
开发语言·前端·javascript·学习·ecmascript
yqcoder34 分钟前
JS 类型检测双雄:typeof vs instanceof 深度解析
开发语言·javascript·ecmascript
啊哈一半醒1 小时前
React 核心知识点系统总结:从基础语法到高级 API,一篇文章梳理完整学习路线
javascript·学习·react.js
被考核重击2 小时前
Vue响应式原理(下)
前端·javascript·vue.js
matlab_xiaowang11 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
前端摸鱼匠13 小时前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
REDcker13 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
donecoding14 小时前
一个 sudo 引发的血案:npm 全局包权限错乱彻底修复
前端·node.js·前端工程化