我正在使用
node.js
构建一个应用程序,使用 sqlite3
模块来访问数据存储。我一直遇到的问题是当我跑步时
node myapp.mjs
并且
foo()
被调用(在 log.mjs
模块中),db.run(...)
中的 foo()
语句不会执行,尽管控制台确实输出:
Logged foo!
除了数据库中没有任何更改之外,没有任何错误,也没有任何迹象表明该语句已失败或成功。整行也可以注释掉。
添加行
foo();
如果我直接运行文件,to
log.mjs
工作正常:
node log.mjs
是否导出
foo
。我是否没有理解 ES6 模块的某些导入/导出行为,或者 sqlite3
模块或其他模块是否存在问题?
文件:
myapp.mjs
;起点。
import { foo } from "./bin/commands/log.mjs";
foo();
process.exit(0);
文件:
log.mjs
;魔法没有发生的地方。
import { sqlite3 } from "sqlite3";
sqlite3.verbose();
export function foo() {
let db = new sqlite3.Database("./bin/db/test.db");
db.run("insert into casefile (forum, fileno) values (1, 'LOG0000');");
console.log("Logged foo!");
}
Node 包以 Node.js 回调风格提供异步 API(您提供回调作为每个方法的最后一个参数)。
因此,当您触发sqlite3
时,sqlite 会开始一些处理,但一旦它到达后台的异步操作,它就会停在事件循环中,应用程序的其余部分将继续执行,即
db.run()
后跟 console.log()
,这会杀死你的应用程序,让 sqlite 没有机会继续其操作。当您直接运行 process.exit()
文件时,您不会终止该进程,因此 Node 会等待异步进程完成。
您很可能对包装器包感兴趣,它将
sqlite-async
回调式 API 转换为 Promises,然后您可以等待。例如。像这样的东西:sqlite3