我正在尝试为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();
答案 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
控制台输出,并且脚本永远不会退出。