为什么在导出函数中调用时,node-sqlite3 中的数据库方法不起作用?

问题描述 投票:0回答:1

我正在使用

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.js sqlite ecmascript-6
1个回答
0
投票

Node 包以 Node.js 回调风格提供异步 API(您提供回调作为每个方法的最后一个参数)。

因此,当您触发 

sqlite3

时,sqlite 会开始一些处理,但一旦它到达后台的异步操作,它就会停在事件循环中,应用程序的其余部分将继续执行,即

db.run()
后跟
 console.log()
,这会杀死你的应用程序,让 sqlite 没有机会继续其操作。
当您直接运行 

process.exit()

文件时,您不会终止该进程,因此 Node 会等待异步进程完成。

您很可能对 

log.mjs

 包装器包感兴趣,它将 
sqlite-async 回调式 API 转换为 Promises,然后您可以等待。例如。像这样的东西:
sqlite3

© www.soinside.com 2019 - 2024. All rights reserved.