2017-01-10 2 views
3

私のscala-jsコードでエラーが発生した場合、わかりやすいスタックトレースをサーバーに送ってログに記録したいと思います。 "sensible stacktrace"とは、翻訳されたjavascriptコードではなく、Scalaのメソッド、ファイル名、行番号を与えるものです。スカラスタックトレースを取得

私は、ソースマップを取得し、Javascriptソースマップライブラリ(https://github.com/mozilla/source-map)を使用して、スタックトレースの各要素をjavascriptから対応するScalaコードに変換することによって、うまく進歩しました。

私の問題:エラーをスローしたjavascriptコードの列番号が必要ですが、取得方法はわかりません。 StackTraceElementを印刷する私は、行の末尾に「188」を必要とするが、のtoStringを呼び出し、その結果を解析するよりも、それが他の取得方法が表示されない

oat.browser.views.query.QueryRunView$.renderParamsTable$1(https://localhost:9443/assets/browser-fastopt.js:34787:188) 

と同様の結果が得られます。 StackTraceElementコードを見ると、列番号はAPIにアクセスするためのプライベート変数です。

私は完全に見落としているこれに対する別のアプローチはありますか? JavaScriptのスタックトレースをScalaのスタックトレースに変換するscala-jsに組み込まれているものは何ですか?

+0

このコードはどこかで入手できますか?私はそれを自分自身で利用することに興味があります。 – darkfrog

+0

私はhttps://gist.github.com/bwbecker/e92324dc8875e10f44b5161c2515a186に要点を書いています。これはまだ進行中の作業であることに注意してください。私の注意は他のものに転用されたので、投稿されたコードはまだかなり磨かれていません。それが役に立つなら、素晴らしい。フィードバック以上の歓迎。 – bwbecker

答えて

1

その後、私が必要としているライブラリStackTraceJSが見つかりました。私はJSNlogのファサードにScalaJSのファサードを組み合わせて、私のニーズに合ったパッケージを作り上げました。 jsnlog-facadeを参照してください。 Scalaスタックトレースを使用して、ブラウザコンソールおよび/またはサーバーにログを記録します。デモコードが含まれています。

1

これはJava APIであり、Scala.jsはJava APIにパブリックメンバーを追加できないため、パブリックAPIには列番号にアクセスするものは何もありません。

StackTraceElementの場合、この問題を回避するには、getColumnNumber(): IntをJavaScriptにエクスポートしてください。この「機能」は文書化されていないで、そしてScala.jsの将来のメジャーバージョンで予告なしに変更される可能性がありますことを

def columnNumberOfStackTraceElement(ste: StackTraceElement): Int = 
    ste.asInstanceOf[js.Dynamic].getColumnNumber().asInstanceOf[Int] 

注:このため、列番号を取得するには、次のコードを使用することができます。それが消えると、信頼できるものに置き換えられます。それまでの間に、上記はあなたに行くはずです。

+0

優秀!ありがとうございました! – bwbecker