You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何node-sqlite3数据库方法在导出函数中调用无法生效?

问题分析与解决

核心原因

sqlite3模块的db.run()是异步操作,你在myapp.mjs中调用foo()后立刻执行process.exit(0),强制终止了Node.js进程——此时数据库插入操作还没来得及完成,所以数据库没有变化。

直接运行log.mjs时,Node.js会默认等待事件循环中的所有异步任务执行完毕才退出,所以插入操作能正常完成。

解决方案

步骤1:修改log.mjs,让foo返回Promise,等待异步操作完成

import { sqlite3 } from "sqlite3";

sqlite3.verbose();

export function foo() {
  return new Promise((resolve, reject) => {
    let db = new sqlite3.Database("./bin/db/test.db");
    db.run("insert into casefile (forum, fileno) values (1, 'LOG0000');", (err) => {
      db.close(); // 操作完成后关闭数据库连接
      if (err) reject(err);
      else resolve();
    });
    console.log("Logged foo!");
  });
}

步骤2:修改myapp.mjs,使用await等待foo执行完毕,再退出进程

import { foo } from "./bin/commands/log.mjs";

async function main() {
  try {
    await foo();
    process.exit(0);
  } catch (err) {
    console.error("数据库操作失败:", err);
    process.exit(1);
  }
}

main();

额外说明

  • 不要在异步操作未完成时强制退出进程,这会导致未完成的I/O任务被中断
  • 数据库操作完成后记得调用db.close(),避免连接泄漏

内容的提问来源于stack exchange,提问作者gvkv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:26:06