Node.js в качестве бэкэндской платформы набрал огромную тягу и отдельно от всех Технические льготы Это обеспечивает, я лично чувствую, что это простота, с которой мы достигаем намного больше с намного меньше Это дает ему край.
В этой статье я хотел бы прикоснуться к часто упущенной извлеченной теме класса ошибок в Node.js. По моему опыту в качестве рецензента кода Node.js я видел даже опытные Devs, делая тривиальные ошибки при броске ошибки.
function breakPromise() { return new Promise((resolve, reject) => { reject('something'); }); } breakPromise() .catch(e => { console.log(e); }); -------------------------- Result of console.log something
Рассмотрим вышеупомянутый кусок кода. Мы отвергаем обещание, используя строку. Заявление Console.log в блоке Catch будет просто печатать « что-то ‘. Представьте, что вы будете делать, если бы вам поручено исправить ошибку, которая просто напечатала такие строки в журнал.
Мы можем исправить эту ситуацию довольно легко, отвергая/бросая экземпляры Ошибка . класс.
function breakPromiseSmart() { return new Promise((resolve, reject) => { reject(new Error('something bad')); }); } breakPromiseSmart() .catch(e => { console.log(e); }); ----------------------------- Result of console.log Error: something bad at Promise (index.js:3:16) at new Promise () at breakPromiseSmart (index.js:2:12) at Object. (index.js:7:1) at Module._compile (module.js:652:30) at Object.Module._extensions..js (module.js:663:10) at Module.load (module.js:565:32) at tryModuleLoad (module.js:505:12) at Function.Module._load (module.js:497:3) at Function.Module.runMain (module.js:693:10)
Очевидно, теперь у нас есть гораздо больше информации для работы, и поэтому мы никогда не должны бросать строковые ошибки.
Ошибки, поднятые в Node.js наследуют или представляют собой экземпляры стандартного класса ошибок JavaScript.
Класс ошибок предоставляет некоторые полезные свойства, такие как
- сообщение (сообщение об ошибке)
- Имя (имя ошибки)
- стек (Имя файла, номер строки, стек вызова функция)
Мы можем сделать наши журналы ошибок гораздо более полезными, добавляя свойства на объекты ошибок, однако, Лучший способ сделать это – создать пользовательские классы ошибок, расширяя класс ошибок.
class BadRequestError extends Error { constructor(message, meta = {}) { super(message); Error.captureStackTrace(this, BadRequestError); let proto = Object.getPrototypeOf(this); proto.name = 'BadRequestError'; this.meta = meta; } toString() { return `${super.toString()} ${JSON.stringify(this.meta)}`; } } function breakPromise() { return new Promise((resolve, reject) => { reject(new BadRequestError('something bad', { expected: 'this', got: 'that' })); }); } breakPromise() .catch(e => { console.log(e); }); -------------------------------- Result of console.log { BadRequestError: something bad at Promise (index.js:23:16) at new Promise () at breakPromise (index.js:22:12) at Object. (index.js:30:1) at Module._compile (module.js:652:30) at Object.Module._extensions..js (module.js:663:10) at Module.load (module.js:565:32) at tryModuleLoad (module.js:505:12) at Function.Module._load (module.js:497:3) at Function.Module.runMain (module.js:693:10) meta: { expected: 'this', got: 'that' } }
Мы видим, что, расширяя класс ошибок для создания BadrequestError Мы смогли добавить гораздо больше информации в трассировку стека и обогащать наши журналы.
Утверждение Error.capturestacktrace (это, badrequesteRor); Короче говоря, используется для исключения конструктора из трассы стека.
Если мы создадим несколько таких классов ошибок и бросайте соответствующим образом, мы можем вернуть правильные ответы. Например
breakPromise() .catch(e => { if (e instanceof BadRequestError) { res.status(400); } else if (e instanceof SomeotherError) { res.status(412); } else { res.status(500); } return res.send({ message: e.message, error: e.meta }); });
Все, что я упомянул на посте, очень тривиален, если вы заботитесь об ошибках, но доверяйте мне, не так много разработчиков уделяют этому вниманию. Я надеюсь после того, как этот переподготовки, давая первоклассные предпочтения на ошибки, будут на вершине вашего ума.
Отказ от ответственности: Пожалуйста, игнорируйте некоторые заявления, где я сделал слишком простые обобщения.