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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:50:17