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

getting the entire error stacktrace in nodejs

我的 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 并没有 eating/chopping 去掉多余的位。我添加了以下内容

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

然后我得到

type: object
error: SqliteError: no such column: 

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

我用的是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​}​`​;
        }

    })
);