Как работает обработчик ошибок? - PullRequest
0 голосов
/ 08 мая 2018

Как срабатывает обработчик ошибок ?

В примере кода я обнаружил, что он находится внизу всех функций промежуточного программного обеспечения. Важна ли позиция?

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете обратиться к примеру ниже для некоторых деталей. Здесь для конечной точки GET '/' промежуточное программное обеспечение явно выдает ошибку 'error error'. В этот момент запускается механизм экспресс-обработки ошибок, который ищет обработчик ошибок (с ошибкой в ​​качестве параметра). В результате последующее «Hello» не отправляется обратно клиенту, поскольку его обработчик не является ошибочным.

Последующие обработчики ошибок logErrors, clientErrorHandler и errorHandler вызываются одна за другой для выполнения соответствующих задач, при этом последний из них записывает ответ.

Причина, по которой они помещаются в конце, заключается в том, чтобы отлавливать ошибки, выдаваемые объявленным промежуточным программным обеспечением, и элегантно обрабатывать их, то есть печатать, регистрировать, отправлять почту и т. Д. Думать об этом с точки зрения механизма try catch в других языках, таких как Java , Если заявлено выше других промежуточных программ, они будут бесполезны, так как ошибки не будут обработаны. Вы можете увидеть разницу в выводе, изменив порядок запроса 'GET' на обработчики ошибок.

const express = require('express');
const app = express();

app.get('/', (req, res, next) => next(new Error('problem error')), (req, res) => {
    res.status(200).send("Hello");
});

app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);

function logErrors (err, req, res, next) {
    console.error(err.stack)
    next(err)
}

function clientErrorHandler (err, req, res, next) {
    if (req.xhr) {
        res.status(500).send({ error: 'Something failed!' })
    } else {
        next(err)
    }
}

function errorHandler (err, req, res, next) {
    if (res.headersSent) {
        return next(err)
    }
    res.status(500)
    res.render('error', { error: err })
}

app.listen(3000, () => console.log('Example app listening on port 3000!'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...