【问题标题】:Javascript: Exit script after async functionJavascript:异步函数后退出脚本
【发布时间】:2019-02-26 21:21:55
【问题描述】:

我正在尝试为 nodeJS 项目创建数据库设置脚本。 我有以下异步函数 createTable 查询 PostgreSQL 数据库。

问题是执行完所有操作后脚本并没有退出。 我尝试将process.exit(0) 附加到文件末尾,但这只是过早地终止了脚本(我认为它在异步操作运行时执行)。

操作完成后如何正确退出脚本?

const dbInit = () => {
  const createTable = async (creationQuery, tableName) => {
    try {
      const created = await client.query(creationQuery);
      if (created) logger(`'${tableName}' table created successfully`);
    } catch (err) {
      logger(err.message);
    }
  };

  createTable(Schemas.userModel, 'Users');
  createTable(Schemas.orderModel, 'Orders');
};
dbInit();

【问题讨论】:

标签: javascript node.js asynchronous async-await


【解决方案1】:

当事件循环干涸时,Node.js 退出。如果async函数结束后脚本没有退出,这意味着有一些东西阻止它完成。

在这种情况下,有数据库查询但数据库连接没有关闭,这就是原因。控制流也搞砸了,没有结果承诺链。

应该是:

  const createTable = async (creationQuery, tableName) => {
    try {
      const created = await client.query(creationQuery);
      if (created) logger(`'${tableName}' table created successfully`);
    } catch (err) {
      logger(err.message);
    }
  };

const dbInit = async () => {
  try {
    await createTable(Schemas.userModel, 'Users');
    await createTable(Schemas.orderModel, 'Orders');
    process.exit(0);
    // or close database connection
  } catch (err) {
    process.exit(1);
  }
};
dbInit();

所有拒绝都应使用 promise catch()try..catch 处理。在这种情况下不处理它们会导致UnhandledPromiseRejectionWarning 控制台输出和永远不会退出的脚本。

【讨论】:

  • 这为我节省了数小时的搜索时间,谢谢! @estus-flask
猜你喜欢
  • 2017-10-07
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多