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

ttygqcqt  于 12个月前  发布在  Node.js
关注(0)|答案(1)|浏览(119)

我正在使用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!");
}

hujrc8aj

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,然后您可以等待。例如:

await foo(); // Top-level await
process.exit(0);

async function foo() {
  const db = await Database.open("path/to/file");
  await db.run("statement");
  console.log("after some time");
}

字符串

相关问题