我对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
。无论如何,我怎么能得到全部?
我正在使用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}`;
}
})
);