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; } } }
关键改动说明
重构
databaseGet:- 移除回调参数,改为返回Promise对象
- 在数据库操作的回调中,用
resolve返回查询结果、reject抛出错误,让外部能通过await和try/catch处理异步逻辑
简化
checkUserban:- 直接
await数据库查询结果,无需定义内部回调函数 - 通过判断返回的
rows数组长度,确定用户是否被封禁(数组长度>0说明存在封禁记录) - 增加
try/catch捕获查询错误,避免程序崩溃,同时返回符合业务需求的默认值
- 直接
使用示例
在主代码中调用时,直接用await获取结果:
const db = new Db(); const isBanned = await db.checkUserban(123); console.log('用户是否被封禁:', isBanned);
内容的提问来源于stack exchange,提问作者Vanchugov Artemy
相关产品推荐
相关产品推荐

