Javascript:异步功能后退出脚本

时间:2018-09-22 21:40:35

标签: javascript node.js asynchronous 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();

1 个答案:

答案 0 :(得分:3)

当事件循环耗尽时,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();

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