Javascript:异步功能后退出脚本

Ogu*_*oye 2 javascript asynchronous node.js async-await

我正在尝试为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();
Run Code Online (Sandbox Code Playgroud)

Est*_*ask 5

事件循环耗尽时,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();
Run Code Online (Sandbox Code Playgroud)

所有拒绝都应以promise catch()try..catch。在这种情况下,如果不处理它们,将导致UnhandledPromiseRejectionWarning控制台输出,并且脚本永远不会退出。

  • 这节省了我几个小时的搜索时间,谢谢!@estus-烧瓶 (2认同)