我正在使用sqlite3
构建一个应用程序,使用sqlite3
模块访问数据存储。
node myapp.mjs
字符串
并且foo()
被调用(在log.mjs
模块中),foo()
中的db.run(...)
语句不会执行,尽管控制台会输出:
Logged foo!
型
没有错误,没有任何迹象表明语句已经失败或成功保存,因为数据库中没有更改。整行都可以注解掉。
添加行
foo();
型
到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!");
}
型
1条答案
按热度按时间hujrc8aj1#
sqlite3
Node包以Node.js回调风格提供异步API(您可以将回调作为每个方法的最后一个参数提供)。因此,当你启动
db.run()
时,sqlite会开始一些处理,但是一旦它在后台执行了一个cndc操作,它就会停在事件循环中,你的应用的其余部分继续执行,即console.log()
之后是process.exit()
,这会杀死你的应用,让sqlite没有机会继续其操作。当您直接运行
log.mjs
文件时,您不会杀死进程,因此Node会等待log.mjs
进程完成。导入/导出应用程序的这一部分并不涉及此行为,只会在执行DMAC操作之前终止进程。
您可能会对
sqlite-async
Package 器包感兴趣,它将sqlite3
回调风格的API转换为Promises,然后您可以等待。例如:字符串