Рубрики
Без рубрики

Улучшение использования класса ошибок в Node.js

Правильное использование класса ошибок в Node.js часто наиболее упускается из виду среди новых Nodejs devs. Эта короткая статья поможет вам использовать его лучше в ваших следующих проектах.

Автор оригинала: Aditya Jha.

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 будет просто печатать « что-то ‘. Представьте, что вы будете делать, если бы вам поручено исправить ошибку, которая просто напечатала такие строки в журнал.

плохое ошибка-3.png

Мы можем исправить эту ситуацию довольно легко, отвергая/бросая экземпляры Ошибка . класс.

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.

Класс ошибок предоставляет некоторые полезные свойства, такие как

  1. сообщение (сообщение об ошибке)
  2. Имя (имя ошибки)
  3. стек (Имя файла, номер строки, стек вызова функция)

Мы можем сделать наши журналы ошибок гораздо более полезными, добавляя свойства на объекты ошибок, однако, Лучший способ сделать это – создать пользовательские классы ошибок, расширяя класс ошибок.

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
        });
    });

Все, что я упомянул на посте, очень тривиален, если вы заботитесь об ошибках, но доверяйте мне, не так много разработчиков уделяют этому вниманию. Я надеюсь после того, как этот переподготовки, давая первоклассные предпочтения на ошибки, будут на вершине вашего ума.

Отказ от ответственности: Пожалуйста, игнорируйте некоторые заявления, где я сделал слишком простые обобщения.