Узлы Cors ловят ошибку обратного вызова промежуточного ПО - PullRequest
2 голосов
/ 03 июня 2019

У меня есть следующий код для проверки исходного заголовка и разрешения доступа с использованием Express и плагина npm cors

const app = express();
const cors = require('cors')
var corsOptions = {
    origin: function (origin: any, callback: any) {
        if (!origin || whitelist.indexOf(origin) !== -1) {
            callback(null, true)
        } else {
            callback(new Error('Not allowed by CORS'))
        }
    }
}
app.use(cors(corsOptions));

Теперь мне интересно, есть ли способ перехватить ответный вызов "новая ошибка"?

И отправить обратно статус http 400?

Спасибо!

1 Ответ

3 голосов
/ 03 июня 2019

Да, это объясняется в документах Express в разделе Обработка ошибок .

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

Если вы передаете ошибку в next() и не обрабатываете ее в пользовательском обработчике ошибок, она будет обрабатываться встроенным обработчиком ошибок; ошибка будет записана клиенту с трассировкой стека. Трассировка стека не включена в производственную среду.

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

В любом случае, чтобы переопределить этот обработчик, обратитесь к разделу в документах Express под названием Запись обработчиков ошибок .

Это объясняет:

Определение функций промежуточного программного обеспечения для обработки ошибок аналогично другим функциям промежуточного программного обеспечения, за исключением того, что функции для обработки ошибок имеют четыре аргумента вместо трех: (err, req, res, next). Например:

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

Вы определяете промежуточное ПО для обработки ошибок последним, после других app.use() и маршрутизируете вызовы

Так что в вашем случае, если вы хотите ответить 400, вы можете написать что-то вроде этого:

const app = express();
const cors = require('cors')
var corsOptions = {
    origin: function (origin: any, callback: any) {
        if (!origin || whitelist.indexOf(origin) !== -1) {
            callback(null, true)
        } else {
            callback(new Error('Not allowed by CORS'))
        }
    }
}
app.use(cors(corsOptions));

// This overrides the default error handler, and must be called _last_ on the app
app.use(function customErrorHandler(err, req, res, next) {
   res.status(400).send('Your custom error message here');
});

Express также включает в свой репозиторий пример сервера , показывая это переопределение обработки erorr.

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