在nodejs中获取整个错误堆栈跟踪

问题描述 投票:0回答:1

我对SQLite查询遵循简单的try … catch模式

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

我已经编写了自己的小型日志记录例程,因此我可以用颜色修饰消息(使用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: 

好像stacktrace正在流式传输,并且所有这些都没有进入mylogger。无论如何,我怎么能得到全部?

node.js stack-trace
1个回答
0
投票

我正在使用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​}​`​;
        }

    })
);
© www.soinside.com 2019 - 2024. All rights reserved.