我正在使用node.js构建一个应用程序,使用sqlite3模块访问数据存储.我一直有的问题是当我 run 的时候

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!");
}

推荐答案

sqlite3 node 包以Node.js回调方式提供了异步API(您将回调作 for each 方法的最后一个参数提供).

因此,当你触发db.run()时,Sqlite开始一些处理,但一旦它在幕后达到一个异步操作,它就停在事件循环中,你应用程序的其余部分继续执行,即console.log()后面跟着process.exit(),这会杀死你的应用程序,没有机会让Sqlite继续它的操作.

当您直接运行log.mjs文件时,您不会终止进程,因此Node会等待异步进程完成.

事实上,您导入/导出应用程序的这一部分并不涉及此行为,只是在异步操作完成之前终止进程.

您很可能对sqlite-async包装器包感兴趣,它将sqlite3回调风格的API转换为promise ,然后您可以等待.例如,类似于:

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");
}

Node.js相关问答推荐

如何使用updateMany()和Node.js的方法?

DocuSign:调用createEntaine时,RequestJWTApplicationToken返回401 AUTHORIZATION_INVALID_TOKEN

已知NPM无法在node.js V12上运行的问题

如何从shell脚本中计算ecmascript模块?

使用ReadableStream.管道时NodeJS Crypto Hash不正确

Nest Js - 在 multer 拦截器中如何设置最大文件上传大小并进行可选文件上传

使用 NPM 8 安装本地构建

如何通过node下载zip并直接解压zip?

fastify:流过早关闭

JAVASCRIPT:foreach 循环后的空数组

类 WebSwapCGLLayer 在 Mac OS X /System 和 node_modules 中都实现了

使 pm2 登录到控制台

编写可维护的事件驱动代码

如何运行用 TypeScript 编写的 Mocha 测试?

名称类型为 mongoose 的字段

安装 node 包时可以使用自定义目录名称而不是node_modules吗?

未在 Windows 8.1 上构建的 node 包 - 缺少 Microsoft.Cpp.Default.props

从 JavaScript 文件或 REPL 中 require()'ing CoffeeScript 文件

如何设置 useMongoClient (Mongoose 4.11.0)?

node.js 找不到模块mongodb