Node.js中SQLite3的Async/Await无法正常工作,请求技术帮助
SQLite INSERT查询执行失败及输出顺序异常问题
我尝试向SQLite数据库执行INSERT查询,但函数无法正常工作。代码如下:
const sqlite3 = require('sqlite3'); const { open } = require('sqlite'); async function main() { try { sqlite3.verbose(); const ordersDb = await createDbConnection('./test.db'); const orderProcessed = await orderAlreadyProcessed(ordersDb, "users"); console.log('four '); } catch (error) { console.error(error); } } async function orderAlreadyProcessed(ordersDb, orderNumberStr) { try { console.log('two '); const query = `INSERT INTO users (first_name , last_name , username , password ) VALUES ('fdlfkld' , 'sfhdfjdk' , 'sdfhsdfhsd' , 'sdffs' )` const row = await ordersDb.run(query); console.log('three '); } catch (error) { console.error(error); throw error; } } function createDbConnection(filename) { return open({ filename, driver: sqlite3.Database }); } let one = [ 1 , 2, 3 ] Promise.all(one.map(async()=>{ await main(); }))
我期望的控制台输出顺序为:
two three four two three four two three four
目前SQLite无法正常工作,希望得到解决该问题的帮助。
解决步骤
验证数据库表结构
首先确认test.db中存在users表,且包含first_name、last_name、username、password这四个字段。可以用SQLite命令行工具执行PRAGMA table_info(users);来检查表结构是否匹配。修复并发连接问题
SQLite是文件型数据库,并发写入时会触发锁机制。当前用Promise.all同时启动3个main()实例,每个实例都打开新的数据库连接,容易导致锁冲突,阻塞INSERT操作同时打乱输出顺序。改成串行执行即可解决:let one = [1, 2, 3]; (async () => { for (const _ of one) { await main(); } })();改用参数化查询
硬编码值的写法可能出现语法问题,还存在SQL注入风险,建议替换为参数化查询:async function orderAlreadyProcessed(ordersDb, orderNumberStr) { try { console.log('two '); const query = `INSERT INTO users (first_name, last_name, username, password) VALUES (?, ?, ?, ?)`; const result = await ordersDb.run(query, ['fdlfkld', 'sfhdfjdk', 'sdfhsdfhsd', 'sdffs']); console.log('three '); // 可通过result.lastID确认插入成功,打印插入行ID // console.log('插入成功,ID:', result.lastID); } catch (error) { console.error(error); throw error; } }检查连接状态
在main函数中添加连接日志,确认数据库连接正常建立:const ordersDb = await createDbConnection('./test.db'); console.log('数据库连接成功');
内容的提问来源于stack exchange,提问作者ajith ajith
相关产品推荐
相关产品推荐

