ExpressJS промежуточное программное обеспечение, которое также ловит ошибки? - PullRequest
0 голосов
/ 01 марта 2019

Я пишу промежуточное программное обеспечение, которое я применяю на уровне маршрута, например:

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

, чтобы я мог сделать некоторые вещи с запросом.Но мне также нужно отлавливать ошибки, чтобы сделать особую обработку.Я знаю, что потом могу добавить обработчик, например:

... (req, res) => { ... }, myErrorHandler);

, и он будет вызываться просто отлично.

Но мой вопрос, есть ли способ получить один кусокпромежуточное программное обеспечение, которое может делать все это, поэтому мне не нужны две точки интеграции?Я пытался вызвать req.on('error', (err) => { ... }) в своем промежуточном программном обеспечении, но, кажется, он никогда не вызывался.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

В итоге я решил эту проблему, написав вспомогательную функцию, которая обертывает фактический обработчик.Это выглядит так:

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');
    ...
}));
0 голосов
/ 01 марта 2019

Express поставляется со встроенным обработчиком ошибок , который заботится о любых ошибках, которые могут возникнуть в приложении.Эта промежуточная функция обработки ошибок по умолчанию добавляется в конец стека функций промежуточного программного обеспечения.

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

// Router Error Handler
router.use(function (err, req, res, next) {

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...