【发布时间】:2020-07-25 07:14:18
【问题描述】:
如果我的 Node.js v.13.12 应用遇到一些技术问题,我希望:
- 在数据库中写入日志消息;
- 使用特定代码退出 Node.js 应用程序。
为了实现这种行为,我使用以下代码:
const onError = async function onError(error) {
await logger.log("Critical error: " + error);
process.exit(UNCAUGHT_FATAL_EXCEPTION);
}
问题是当我执行上面的代码时,我到达await logger.log(…),进去然后立即继续process.exit(UNCAUGHT_FATAL_EXCEPTION)并执行它。
因此,应用程序在写入数据库完成之前就关闭了,尽管我希望 await 等到 logger.log(…) 完成。
我的问题:
如何确保process.exit(UNCAUGHT_FATAL_EXCEPTION)只有在logger.log(…)完成后才会执行而不使用回调?
更新:
整个logger.log(…)代码链:
export const log = async function log(source, severityNum, severityLevel, limitSeverityNum, functionName, message) {
if ((severityNum > LOG_LEVELS.OFF.intLevel) && (severityNum <= limitSeverityNum)) {
await writeLogToDB(source, severityNum, severityLevel, functionName, message);
}
};
const writeLogToDB = async function writeLogToDB(source, severityNum, severityLevel, functionName, message) {
try {
const con = await getConnection();
con.connect(function (err) {
if (err) throw err;
con.query(qryDict.QUERIES.setAddNewLog, [source, severityNum, severityLevel, functionName, message], function (err) {
try {
if (err) {
console.error("addNewLog", err);
}
let response = JSON.stringify({
"result": true,
"message": "success"
});
} catch (err) {
let response = JSON.stringify({
"result": false,
"message": err
});
return response;
} finally {
con.close();
}
});
});
} catch (err) {
con.close();
console.error(err);
}
};
【问题讨论】:
-
logger.log是否返回承诺? -
不,它有点像
void异步函数,只是写入数据库,仅此而已。 -
你所做的所有
await就是getConnection。您的异步函数不等待回调样式的con.connect和con.query调用。在此处使用承诺。 -
您似乎不需要
log()和_writeLog()。一个似乎实际上是另一个的同义词。您可以避免捆绑/取消捆绑 args(到 js 对象中),只需编写export log = _writeLog; -
@Roamer-1888,好点子。完成。
标签: javascript node.js promise async-await es6-promise