Node.Js 将自定义错误 class 传递到 Express 错误中间件时套接字挂起

Node.Js socket hang up when passing custom Error class into Express error middleware

我正在尝试为我的 Node + Express 服务器中的错误处理中间件编写集成测试,当我传入一个扩展了 Node 的基本错误的自定义错误时,我遇到了套接字挂起 class。

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)

其他值得注意的是,当我在 errorHandler.tsconsole.log(err.status, err.message) 时,我看到 123foobar 出现,所以它被传递到中间件.但是似乎在我不知道的较低级别上发生了一些事情。

我做了一些研究,似乎在进程未正确关闭的地方发生了一些事情,但我不确定扩展基本错误 class 会如何导致这种情况发生。

在此先感谢您的帮助。

我想通了这个问题。在我的测试中,我将 123 作为 foobar 状态代码传递,然后在我的错误处理程序中传递给 res.status(123)。我想 Node(或 Express)有防止发送无效状态代码的保护措施,因为一旦我将 123 更改为 400,套接字错误就消失了。