Node.Js сокет зависает при передаче пользовательского класса Error в Express middleware ошибки - PullRequest
0 голосов
/ 06 апреля 2020

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

Err.ts

class Err extends Error {
  public status: number;

  constructor(message: string, status: number) {
    super(message);
    this.status = status;
  }
}

errorHandler.ts

const errorHandler: ErrorRequestHandler = (err: Err, _req, res, _next) => {
  res.status(err.status || 500).json({
    success: false,
    error: err.message || 'Server error'
  });
};

интеграционные тесты

// SETUP

use(chaiHttp);

const app = express();

app.get('/foo', (_req, _res, next) => {
  return next(new Error());
});

app.get('/qux', (_req, _res, next) => {
  return next(new Err('foobar', 123));
});

app.use(errorHandler);

// TESTING GENERIC, NORMAL NODE ERROR --> THIS WORKS
it('returns a default error when error object is malformed', async () => {
  const res = await request(app).get('/foo');
  expect(res.status).to.equal(500);
  expect(res.body.error).to.equal('Server error');
});

// TESTING CUSTOM ERROR --> THIS THROWS THE SOCKET ERROR
it('returns the passed-in error as is', async () => {
  const res = await request(app).get('/qux');
  expect(res.status).to.equal(123);
  expect(res.body.error).to.equal('foobar');
});

// STACK
     Error: socket hang up
      at connResetException (internal/errors.js:570:14)
      at Socket.socketOnEnd (_http_client.js:440:23)
      at endReadableNT (_stream_readable.js:1185:12)
      at processTicksAndRejections (internal/process/task_queues.js:81:21)

Что еще стоит отметить, это то, что когда я console.log(err.status, err.message) в errorHandler.ts, я вижу 123 и foobar, так что они передаются в промежуточное ПО. Но что-то происходит на более низком уровне, к которому я не причастен.

Я провел некоторое исследование, и, похоже, что-то происходит, когда процесс закрывается ненадлежащим образом, но я не уверен, как расширение базового класса ошибок может привести к этому.

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 06 апреля 2020

Я разобрался в проблеме. В моем тесте я передавал 123 в качестве кода состояния foobar, который затем передавался в res.status(123) в моем обработчике ошибок. Я предполагаю, что Node (или Express) имеет защиту от отправки недопустимых кодов состояния, потому что как только я изменил 123 на 400, ошибка сокета исчезла.

...