получение всей трассировки стека ошибок в nodejs - PullRequest
0 голосов
/ 20 апреля 2020

Я следую простому шаблону try … catch для своих запросов SQLite

try {
    … run query and get result …
}
catch (error) {
    console.log(error);
}

В случае ошибки я получаю хорошую трассировку стека, подобную этой

SqliteError: no such column: 
    at getData (/Users/punkish/Projects/zenodeo/bin/facets.js:8:25)
    at Object.<anonymous> (/Users/punkish/Projects/zenodeo/bin/facets.js:23:1)
    at Module._compile (internal/modules/cjs/loader.js:1156:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1176:10)
    at Module.load (internal/modules/cjs/loader.js:1000:32)
    at Function.Module._load (internal/modules/cjs/loader.js:899:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47

Я написал свой собственный маленький подпрограмма регистрации, так что я могу пометить sh сообщения цветами (используя chalk) и некоторую дополнительную информацию, которую я нахожу полезной, теперь у меня есть

try {
    … run query and get result …
}
catch (error) {
    mylogger(error);
}

За исключением того, что теперь я просто получаю следующее

SqliteError: no such column: 

И нет, mylogger не пожирает / отбирает лишние биты. Я добавил следующее к этому

if (typeof error === 'object') {
    log('type: object');
    log(`error: ${JSON.stringify(error)}`)
}

и получаю

type: object
error: SqliteError: no such column: 

Похоже, что стековая трассировка потоковая, и все это не go до mylogger , В любом случае, как я могу получить все это?

1 Ответ

2 голосов
/ 21 апреля 2020

Я использую Winston и раньше сталкивался с той же проблемой. Я использую .constructor вместо instanceOf, чтобы определить тип данных, который может быть лучшей практикой. Но мой код может иметь для вас какое-то значение:

winston​.​format​.​printf​(​info​ ​=>​ {
        ​if​ (​info​.​message​.​constructor​ ​===​ ​Object​ ​||​ ​Error​) {
            ​if​ (​info​.​stack​ ​===​ ​undefined​) {
                ​return​ ​`​${​info​.​timestamp​}​ [​${​info​.​label​}​] ​${​info​.​level​}​: ​${​JSON​.​stringify​(​info​.​message​, ​null​, ​1​)​}​`​;
            } ​else​ {
                ​return​ ​`​${​info​.​timestamp​}​ [​${​info​.​label​}​] ​${​info​.​level​}​: ​${​info​.​message​}​ Stack: ​${​info​.​stack​}​`​;
            }
        } ​else​ {
            ​return​ ​`​${​info​.​timestamp​}​ [​${​info​.​label​}​] ​${​info​.​level​}​: ​${​info​.​message​}​`​;
        }

    })
);
...