簡體   English   中英

將自定義錯誤 class 傳遞到 Express 錯誤中間件時,Node.Js 套接字掛起

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

我正在嘗試在我的 Node + Express 服務器中為我的錯誤處理中間件編寫集成測試,當我傳入一個擴展 Node 的基本錯誤 class 的自定義錯誤時,我遇到了套接字掛起。

錯誤.ts

class Err extends Error {
  public status: number;

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

錯誤處理程序.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,套接字錯誤就消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM