Как использовать обратный вызов обработчика ошибок в политике Sails.js?
Задав этот вопрос, я обнаружил, что могу добавить массив обратных вызовов к конечной точке в приложении sails, например:
файл: /api/policies/somepolicy.js
module.exports = thisIsAnArrayOfCallbacks;
Это работает нормально, пока каждый член thisIsAnArrayOfCallbacks
это function
который принимает req
, res
, а также next
в качестве аргументов. Вызов контроллера выполняет все функции в массиве, и ожидаемый результат получается в нормальном потоке.
Но при использовании errorHandler
обратный вызов (как в этом примере), который требует дополнительного err
параметр, он не работает должным образом: версия только для экспресс app.get('/path', thisIsAnArrayOfCallbacks)
позволяет errorHandler
чтобы получить исключение и сообщить правильный ответ клиенту, но при использовании способа паруса, errorHandler
функция не вызывается, и в ответ выдается исключение.
Как я мог получить err
параметр или поймать исключение произошло в одной из функций thisIsAnArrayOfCallbacks
отправить правильный ответ (предпочтительный) клиенту?
Заранее спасибо.
1 ответ
Вы правы в том, что политики не могут быть определены как обратные вызовы ошибок; они являются исключительно промежуточным программным обеспечением для обработки маршрутов и фактически привязаны к каждому отдельному маршруту, к которому они применяются. В идеале вы должны отлавливать любые ошибки в самих функциях политики, используя try/catch
и отправить ответ, используя что-то вроде res.forbidden()
, res.badRequest()
, res.serverError()
и т. д. В Sails v0.10 вы можете сделать любой пользовательский ответ и сохранить его в api/responses
папка.
Если вы действительно хотите реализовать универсальный обработчик ошибок в Sails, у вас есть два варианта: либо переопределить стандартный обработчик 500 (в Sails v0.10 это /api/responses/serverError
в v0.9.x это config/500.js
) или (в версии 0.10) создайте пользовательское промежуточное ПО Express и загрузите его, используя sails.config.express.loadMiddleware
, Посмотрите этот вопрос SO для получения подробной информации о втором варианте и не забудьте добавить свой собственный обработчик ошибок после маршрутизатора и до (или вместо) обработчика 500.