node.js - 如何在不强制使用日志库的情况下从 NPM 包中进行日志记录
问题描述
我正在编写一个公司 npm 包(在打字稿中),并将现有代码移植到其中。在现有代码中,有一些console.log
,console.warn
和console.error
语句。像这样:
try {
const foo = getFoo("bar");
return callback(undefined, foo);
} catch (e) {
console.error(e);
return cb(new httpErrors.BadRequest("Some message"));
}
所以正在发生的事情是:
- 记录错误
- 调用带有另一个错误的回调,而不是传入原始错误
这是我们想要的行为,因为我们不想返回原始错误消息,但我们确实希望它出现在我们的日志中。
现在我要转移到一个包,我想应用一些最佳实践并删除console
调用。这是一个 tslint 规则,我同意不取决于包作者来填写包用户的日志。
那么这里最好的方法是什么?
我已经阅读了有关该debug
软件包的信息,但这仅用于开发目的。另外,这意味着我们不会有我们的日志消息,除非我们设置DEBUG=...
我想知道EventEmitter
在我的包中使用单例是否是一种选择。但话又说回来,单例被视为一种反模式。
而且我不想添加日志库作为依赖项,因为作为包作者,我不能说要使用哪个日志库。
我考虑过的最后一个选项是允许传入一个我可以调用的日志记录函数,但这对我来说感觉有点糟糕。
那么,允许从(TypeScript/npm)库中记录消息的首选技术是什么?
(如果有的话;我对 Node/TypeScript 生态系统还很陌生)。
解决方案
那么,允许从(TypeScript/npm)库中记录消息的首选技术是什么?
您希望处理默认错误行为,同时让消费者有机会查看错误消息。
从字面上看,您的选择是
- 采取零依赖性并在带外提供这些消息,例如使用事件发射器
- 依赖于您选择的日志库。
我很乐意选择选项 1。对于 TypeScript,我也会使用类型安全版本,例如https://basarat.gitbooks.io/typescript/docs/tips/typed-event.html
推荐阅读
- amazon-web-services - SSO - 权限集不能承担角色
- ruby-on-rails - 如何覆盖来自 :require_no_authentication 中的设计集的 Flash 消息
- java - java - 如何在java spring中将多个枚举映射到同一列?
- javascript - 如何在按钮单击 [JAVASCRIPT] 上附加和运行脚本
- typescript - 从 TypeScript 中自定义类型的键构造字符串联合类型
- azure-devops - Azure DevOps - 自定义任务板上的列 - SCRUM 流程
- sql - 从excel vba中删除多列列表框的选定行
- javascript - 重复的玩家名称不应该在同一个数组中
- python - 数据帧中连续负值的计数器
- angular - 如果满足条件,如何在 Angular 中显示图像