为何node-sqlite3数据库方法在导出函数中调用无法生效?
问题分析与解决
核心原因
sqlite3模块的db.run()是异步操作,你在myapp.mjs中调用foo()后立刻执行process.exit(0),强制终止了Node.js进程——此时数据库插入操作还没来得及完成,所以数据库没有变化。
直接运行log.mjs时,Node.js会默认等待事件循环中的所有异步任务执行完毕才退出,所以插入操作能正常完成。
解决方案
步骤1:修改log.mjs,让foo返回Promise,等待异步操作完成
import { sqlite3 } from "sqlite3"; sqlite3.verbose(); export function foo() { return new Promise((resolve, reject) => { let db = new sqlite3.Database("./bin/db/test.db"); db.run("insert into casefile (forum, fileno) values (1, 'LOG0000');", (err) => { db.close(); // 操作完成后关闭数据库连接 if (err) reject(err); else resolve(); }); console.log("Logged foo!"); }); }
步骤2:修改myapp.mjs,使用await等待foo执行完毕,再退出进程
import { foo } from "./bin/commands/log.mjs"; async function main() { try { await foo(); process.exit(0); } catch (err) { console.error("数据库操作失败:", err); process.exit(1); } } main();
额外说明
- 不要在异步操作未完成时强制退出进程,这会导致未完成的I/O任务被中断
- 数据库操作完成后记得调用
db.close(),避免连接泄漏
内容的提问来源于stack exchange,提问作者gvkv
相关产品推荐
相关产品推荐

