ExpressJS中间件还捕获错误?

时间:2019-02-28 23:24:19

标签: node.js express

我正在编写要在路由级别应用的中间件,如下所示:

awk -F, -v RS='\r?\n' 'NR>1 { system("mkdir -p dir"$2"; mv "$1"-* dir"$2) }' dataframe.csv

所以我可以根据请求做一些事情。但是我还需要捕获错误才能进行一些特殊处理。我知道以后可以像这样添加处理程序:

router.get('/foo', myMiddleware, (req, res) => { ... });

就可以了。

但是我的问题是,有没有办法拥有一个可以完成所有这些工作的中间件,所以我不需要两点集成?我尝试在中间件中调用... (req, res) => { ... }, myErrorHandler); ,但似乎从未调用过它。

2 个答案:

答案 0 :(得分:0)

Express带有built-in error handler,可解决应用程序中可能遇到的任何错误。默认的错误处理中间件功能已添加到中间件功能栈的末尾。

x

答案 1 :(得分:0)

最后,我通过编写包装实际处理程序的辅助函数来解决了这个问题。看起来像这样:

function checkPage(handler: express.RequestHandler) {
    return async (req: express.Request, res: express.Response, next: express.NextFunction) => {
        let _write = res.write;
        res.write = chunk => {
            if (req.query.verbose) {
                return _write.call(res, `<p>${chunk}</p>`);
            } else {
                return true;
            }
        }

        try {
            await handler(req, res, next);
            res.write('<hr/><p style="color:green;"><b>happy</b></p>');
        } catch (err) {
            res.write(`<p style="color:red;">${err}</p>`);
            res.write('<hr/><p style="color:red;"><b>SAD!</b></p>')
        }

        res.end();
    }
}

然后在我的路由处理程序中,我就这样使用它:

router.get('/foo', checkPage(async (req, res, next) => {
    ...
    res.write('stuff');
    ...
}));