Как заставить koa ctx.throw () использовать application / json, а не text / plain - PullRequest
0 голосов
/ 03 октября 2018

Я создал собственный обработчик ошибок для моего приложения koa, который прекрасно работает (за исключением одной точки прилипания) - использование ctx.throw() означает, что любая трассировка стека отправляется в журналы сервера, а также любое пользовательское сообщение об ошибке отправляется в ответе.

Проблема one в том, что заголовок Content-Type равен text/plain, но мне действительно нужно, чтобы он был application/json.

app.js:

import Koa from 'koa';
import bodyParser from 'koa-bodyparser';
import logger from 'koa-morgan';

import authentication from './middleware/authentication';
import config from './config';
import errorHandler from './middleware/error-handler';
import notificationsRoutes from './routes/notifications';

const app = new Koa();

app.use(errorHandler);
app.use(bodyParser());
app.use(logger(config.logLevel));
app.use(authentication);
app.use(notificationsRoutes.routes());

export default app;

error-handler.js:

export default async (ctx, next) => {
  return next().catch(({ statusCode, message }) => {
    ctx.throw(statusCode, JSON.stringify({ message }));
  });
};

(я думал, что (statusCode, JSON.stringify({ message })); может привести к ответу в application/json, но это не так.

Я прибегнул к помощи безрезультатноПожалуйста, помогите!

1 Ответ

0 голосов
/ 03 октября 2018

Удалось изменить 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, похоже, порождает много разных мнений, но, похоже, для нас это хорошо работаетТеперь.

...