У меня следующий код маршрутизатора в expressJS, вызывающий функцию модели, которая выполняет простую работу по извлечению записей и созданию файла CSV. Код работает нормально для нормальных ситуаций и, поскольку я поместил следующий (err) в маршрутизатор, он также не взломал sh сервер. Однако я хочу перехватить исключение при создании файла и передать его на вызывающую страницу, как указано в комментариях к коду. Я понимаю, что ответ уже выдан, и поэтому мы получаем ошибку HEADERS_SENT. Как преодолеть это и вернуться на страницу вызова с ошибкой для отображения? Любые рекомендации?.
T_model_router.js
///
///other code...
////
router.get('/', function (req, res, next) {
T_model.getTSetData(ID,
function (err, emplist) {
if (err) {
//<< we need to route this to the same calling page but set an error message there>>
//However, it fails due to header already sent Error [ERR_HTTP_HEADERS_SENT]...
/* res.render('Employee', {
first_name: req.user[0].FIRST_NAME, last_name: req.user[0].LAST_NAME,
error_msg: 'Error occured during file creation',
title: 'Employee', layout: 'index'
});*/
next(err);
}
else {
res.render('Employee', {
empl:emplist,
first_name: req.user[0].FIRST_NAME, last_name: req.user[0].LAST_NAME,
success_msg: 'CSV file created from Emp extract!',
title: 'Employee', layout: 'index'
});
}
})
})
///Following is the model code for <<<T_model.js>>
////
//other code...
///
module.exports.getTSetData = function (input_id, callback) {
let selectQuery = "select emp_name,emp_id,dept_id from emp";
let query = mysql.format(selectQuery, [input_id]);
setTimeout(() => {
mySQLpool.query(query, (err, data) => {
if (err) {
callback(err, null);
} else {
fastcsv
.write(JSON.parse(JSON.stringify(data)), { headers: true })
.on("finish", function () {
console.log("Write to csv format inmemory completed!");
})
.pipe(fsv.createWriteStream("emp_fastcsv_extract.csv"))
.on("finish", function () {
console.log("Write to csv format on DISC completed!");
callback(null, data)
})
.on('error', error => callback(error, null))
callback(null, data);
}
});
}, 100);
}