You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何获取SQLite3查询结果到变量并判断用户封禁状态

解决数据库异步查询问题

核心问题

你当前的代码用回调函数处理数据库查询结果,但async/await未正确作用于异步操作,导致函数提前执行完毕,无法获取查询结果。解决思路是将回调式数据库操作改为Promise封装,让await能正确等待异步结果返回。

修改后的完整代码

export class Db {
    constructor() {
        this.database = database;
    }

    // 重构为Promise式的查询方法
    private databaseGet(sql: string, params: any[]): Promise<any[]> {
        return new Promise((resolve, reject) => {
            this.database.all(sql, params, (err: Error | null, rows: any[]) => {
                if (err) {
                    reject(err); // 抛出查询错误
                } else {
                    resolve(rows); // 返回查询结果
                }
            });
        });
    }

    async checkUserban(userId: number): Promise<boolean> {
        try {
            // 等待数据库查询完成,拿到结果
            const rows = await this.databaseGet('SELECT id FROM bans WHERE user_id = ?', [userId]);
            // 判断是否存在封禁记录:有数据则返回true,否则false
            return rows.length > 0;
        } catch (err) {
            // 处理数据库查询错误,可根据业务需求调整返回值或抛出错误
            console.error('查询用户封禁状态失败:', err);
            return false;
        }
    }
}

关键改动说明

  1. 重构databaseGet:

    • 移除回调参数,改为返回Promise对象
    • 在数据库操作的回调中,用resolve返回查询结果、reject抛出错误,让外部能通过await和try/catch处理异步逻辑
  2. 简化checkUserban:

    • 直接await数据库查询结果,无需定义内部回调函数
    • 通过判断返回的rows数组长度,确定用户是否被封禁(数组长度>0说明存在封禁记录)
    • 增加try/catch捕获查询错误,避免程序崩溃,同时返回符合业务需求的默认值

使用示例

在主代码中调用时,直接用await获取结果:

const db = new Db();
const isBanned = await db.checkUserban(123);
console.log('用户是否被封禁:', isBanned);

内容的提问来源于stack exchange,提问作者Vanchugov Artemy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:45:03