Удалось изменить error-handler
для получения желаемого результата.Работает действительно хорошо - трассировки стека отправляются в журналы сервера, и первая строка этого сообщения становится message
в теле ответа.Некоторых можно считать последним недостатком, но это зависит от того, что вы ищете.
error-handler.js
:
export default async (ctx, next) => {
return next().catch(err => {
const { statusCode, message } = err;
ctx.type = 'json';
ctx.status = statusCode || 500;
ctx.body = {
status: 'error',
message
};
ctx.app.emit('error', err, ctx);
});
};
Нашли это и использовали для справки: https://github.com/koajs/examples/blob/master/errors/app.js
Стоит отметить, что эта пользовательская ошибка - ServerError.js
- используется в приложении;поэтому ctx.status = statusCode || 500
- statusCode
предоставляется ServerError
при использовании, но для нестандартных ошибок, которые выдается, statusCode
доходит до error-handler.js
, так как undefined
, поэтому || 500
необходим.
ServerError.js
:
export class ServerError extends Error {
constructor(statusCode, message) {
super(message);
this.statusCode = statusCode;
}
}
(использование: throw new ServerError(400, 'my informative error message');
)
Нет блоков catch
в любом промежуточном программном обеспечении, и ошибка будет распространяться на всепуть к вашему верхнему errorHandler
промежуточному программному обеспечению в app.js
(именно этого вы и хотите добиться).
Пользовательская обработка ошибок в koa, похоже, порождает много разных мнений, но, похоже, для нас это хорошо работаетТеперь.