首页 > 解决方案 > 在nodejs中获取整个错误堆栈跟踪

问题描述

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

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

似乎堆栈跟踪正在流式传输,并且所有这些都没有转到mylogger. 无论如何,我怎样才能得到所有这些?

标签: node.jsstack-trace

解决方案


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

    })
);

推荐阅读