#javascript #node.js #typescript #express #prototype
#javascript #node.js #typescript #выразить #прототип
Вопрос:
Я создаю промежуточное программное обеспечение для обработки ошибок для node.js с проектом express и TypeScript. Внутри него у меня есть AppError
класс, который расширяется Error
. Это выглядит так:
class AppError extends Error {
public readonly internalCode: number | undefined;
public readonly httpCode: number;
public readonly message: string;
constructor(httpCode: number, message: string, internalCode?: number) {
super();
this.internalCode = internalCode;
this.message = message;
this.httpCode = httpCode;
}
public generateReport(): GenericReport {
return {
code: this.internalCode,
message: this.message,
};
}
}
В настоящее время я добавляю new AppError()
/error
маршрут, чтобы перехватить его с помощью следующего промежуточного программного обеспечения, errorHandler
:
function errorHandler(err: Error, request: Request, response: Response, next: NextFunction,): Response {
if (err instanceof AppError) {
const report = err.generateReport();
return response.status(err.httpCode).json(report);
}
return response.status(500).json(err);
}
Внутри промежуточного программного обеспечения, которое я пытаюсь найти AppError
в err
цепочке [[Prototype]], но проверка всегда завершается ошибкой в коде TypeScript. Однако после переноса его с помощью Babel и запуска версии JS с node
, err instanceof AppError
разрешается true
. Почему этого нет в коде TS?
В приведенном выше примере Object.getPrototypeOf(err)
возвращает me Error {}
, а изменение err
типа на AppError
or any
не влияет на результат.
Насколько я понимаю, вновь созданный объект (после new AppError()
запуска) должен быть связан с [[Прототипом]] AppError
. И я получаю, что это означает, что это действительно создано . curl http://localhost:3333/error
{ "internalCode": 1, "message": "This is an error", "httpCode": 500 }
err
AppError()
В этом репозитории GitHub есть рабочий пример проблемы. Любые разъяснения по этой теме будут с благодарностью приняты.
Комментарии:
1. Что значит сбой в коде typescript? На самом деле вы не запускаете код typescript. Он преобразуется в Javascript. Вы смотрели на результат? Может дать вам подсказку. Может быть проблематичным, что ваш вывод находится
es5
перед классами, где вещь.2. @Evert да … это была моя проблема. У меня был es5 в качестве цели в tsconfig. Большое вам спасибо. Я потратил на это целый час, и это даже не приходило мне в голову.
Ответ №1:
Я взглянул на ваш код. Несколько комментариев:
- Переключение на более поздний вывод ecmascript может исправить это, поскольку ваш вывод не генерирует классы прямо сейчас, потому что в ECMAScript 5 их еще не было.
- Рекомендуется не использовать инструменты ts-node, особенно когда вы пытаетесь отладить что-то вроде. Это может дать потрясающий результат, и приятно просто иметь возможность смотреть на реальный выполняемый javascript.
- Я взглянул на ваш репозиторий и считаю, что вам, вероятно, следует просто использовать
instanceof
для того, что вы пытаетесь сделать. Я думаю, что для целей вашего промежуточного программного обеспечения с ошибками instanceof имеет немного больше смысла.
Если вам интересно, я также написал промежуточное программное обеспечение для обработки ошибок, которое выполняет аналогичную функцию:
https://github.com/curveball/problem/blob/master/src/index.ts