expressJS обработка ERR_HTTP_HEADERS_SENT и возврат к представлению вызова с кодом ошибки - PullRequest
0 голосов
/ 09 января 2020

У меня следующий код маршрутизатора в 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);

}
...