Я пытаюсь написать интеграционные тесты для своего промежуточного программного обеспечения по обработке ошибок на моем сервере 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
, так что они передаются в промежуточное ПО. Но что-то происходит на более низком уровне, к которому я не причастен.
Я провел некоторое исследование, и, похоже, что-то происходит, когда процесс закрывается ненадлежащим образом, но я не уверен, как расширение базового класса ошибок может привести к этому.
Заранее спасибо за любую помощь.