【问题标题】:How to get more verbose logging in a Node application?如何在 Node 应用程序中获得更详细的日志记录?
【发布时间】:2016-06-06 22:12:43
【问题描述】:

我有一个 Node 应用程序,它定义了一些模块,然后启动一个 Express 服务器。问题是,有时 Express 服务器无法启动,我也没有看到任何错误。

发生这种情况时,我会扫描我的git diff 以查找潜在的语法错误并进行修复。这解决了问题,我的服务器又重新启动了。

问题是,我不确定为什么这些语法错误会默默地失败。

我举个例子:

  module.exports = function(server){
    this.register = function (params) {
      return this.Models.User.register(user)
      } // SYNTAX ERROR - extra closing bracket
    }
    return this
  }

当我移除额外的括号时,服务器再次启动,但我认为我会看到一个语法错误,而不是盲目地寻找错误。

更多上下文:我的main.js 文件定义了一个返回承诺的函数。通过直接运行脚本 (nodejs main.js) 来调用 Promise。

这个应用程序中的很多代码都是用 Promises 编写的。这会产生压制错误的效果吗?无论错误发生在什么范围内,我如何确保记录错误?

【问题讨论】:

  • 嗨 Max,我会推荐 Bluebird.js 作为一个具有出色错误支持的 promise 库。另一方面,如果您使用的是 es6 Promises,那么除非您在该 Promise 链上显式调用 .catch,否则您将遇到静默错误。我怀疑您没有发现任何这些错误,因此,它们在承诺链中迷失了。
  • @dustin-stiles,我正在调用“catch”,但这些不是故意错误 - 它们是语法错误,所以我没有明确地调用 throw 或将它们传递给 @ 987654326@ 功能。感谢您推荐试用 Bluebird。
  • 看到语法错误与 Promise 无关。在实际运行任何代码之前首次加载和解析模块时,应该抛出像您显示的语法错误,并且应该在 stderr 上显示,除非您以某种方式抑制了 stderr 或抑制了一般进程异常。所以,正如你目前写的问题,你找错地方了。
  • 另外,在尝试运行服务器之前,您可能会从一些基本的单元测试中受益。单元测试将立即发现语法错误,因为代码甚至不会解析,更不用说运行了。
  • 您指出的行中没有语法错误。这个括号关闭register回调,下一个关闭module.exports = { ...然后你return this然后你把不必要的}放在文件末尾:)这不是Python,先生,缩进没有没关系。

标签: javascript node.js promise


【解决方案1】:

您可以通过以下方式开始记录未处理的承诺拒绝:

process.on("unhandledRejection", (err) => {
   console.error(err); 
});

我们大约在一年前添加了这个钩子。我计划将日志记录或抛出默认行为,很抱歉花了这么长时间。

【讨论】:

  • 如果这就是我们得到的全部答案,我认为我们应该作为How do I handle exceptions globally with native promises in io.js / node.js?的骗子关闭
  • 我会以骗子的身份关闭,但我不确定这我们得到的答案 - 我正在等待 OP 详细说明。
  • 我希望这能解决问题。如果您将此标记为重复,我会理解。
  • 好的,我知道我可以通过throw new Error(reason.trace) 获取跟踪信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2013-03-12
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多