当我的scala-js代码抛出错误时,我想将一个合理的堆栈跟踪发送回我的服务器以放入日志。通过“合理的堆栈跟踪”,我的意思是提供Scala方法,文件名和行号,而不是转换后的javascript代码。
通过获取源映射并使用Javascript源映射库(https://github.com/mozilla/source-map)将堆栈跟踪的每个元素从javascript转换为相应的Scala代码,我取得了很好的进展。
我的问题:我需要抛出错误的javascript代码的列号,但不知道如何获取它。打印StackTraceElement会产生类似于
的结果oat.browser.views.query.QueryRunView$.renderParamsTable$1(https://localhost:9443/assets/browser-fastopt.js:34787:188)
我需要行末尾的“188”,但除了调用toString并解析结果之外,我不知道如何获取它。查看StackTraceElement代码,列号是一个私有变量,API中没有任何内容可以访问它。
还有另一种方法,我完全忽略了吗?在scala-js中内置了一个将javascript堆栈跟踪转换为Scala堆栈跟踪的东西吗?
答案 0 :(得分:1)
公共API中没有任何内容可以访问列号,因为这是一个Java API,并且Scala.js无法将公共成员添加到Java API。
要在StackTraceElement
的情况下解决此问题,我们将 getColumnNumber(): Int
导出到JavaScript。因此,您可以使用以下代码检索列号:
def columnNumberOfStackTraceElement(ste: StackTraceElement): Int =
ste.asInstanceOf[js.Dynamic].getColumnNumber().asInstanceOf[Int]
请注意这个"功能"没有文档,可能会在未来的主要版本的Scala.js中更改,恕不另行通知。如果它消失了,它将被可靠的东西取代。与此同时,上述内容应该让你前进。
答案 1 :(得分:1)
我后来找到了StackTraceJS库来完成我需要的工作。我将ScalaJS外观与JSNlog的外观相结合,提出了一个能很好地满足我需求的软件包。见jsnlog-facade。它使用Scala堆栈跟踪记录到浏览器控制台和/或服务器。包含演示代码。