2016-09-12 22 views
2

fieldsは次のコードでは定義されていませんが、エラーが発生したときにはコンソールには記録されません。この具体的な例では、なぜ、そしてこれを処理する実際の方法は何ですか?JavaScriptエラーがコンソールに表示されませんか?

"Testing"がコンソールに記録されます(行番号2)が、未定義の変数fields(行番号4)は報告されていません。エラーはAPI応答(行番号5)に返されますが、行番号、スタックトレースなどの関連情報はありません。

このログのようなエラーをコンソールに表示するにはどうすればよいですか?

export function post(req, res) { 
    console.log("Testing") 
    User.create(getFields(req, ["name_first", "name_last"])) 
    .then(user => respondJSON (res, fields, { status: 201 })) 
    .catch(err => respondError (res, err)) 
} 

キャッチがエラーで応答しているので、私は次のAPIレスポンスを得る:

{ 
    "error": true, 
    "data": { 
    "message": "fields is not defined" 
    } 
} 

私は、NPMのスクリプトを通じて私のコードを実行するために、バベル6とバベル・ノードを使用しています。私はMorganのロギングも使用しています。ロギングのためにミドルウェアを削除しても、エラー出力は変更されません。

+0

は、コンソールに伝播しない約束で起こるエラーをしますか?たとえば、コンソールに 'console.log(x)'と入力すれば、 'Uncaught ReferenceError:x is not defined 'とスタックトレースが表示されます。 – Connorelsea

+0

[なぜ私はPromise.catchハンドラの内部にスローできませんか?](http://stackoverflow.com/questions/30715367/why-can-i-not-throw-inside-a-promise-catch-handler ) – jib

答えて

6

コンソールに自動ロギングが未処理の例外するためのメカニズムです。プロミスはコールバック内の例外を自動的にキャッチするため、例外は処理されなくなり、自動的には何も記録されません。

ログに記録する場合は、キャッチブロックの末尾にthrow errを追加することができます。これは未処理の約束の拒否に変換されます。これは通常、未処理の例外と同様に処理されます。

+0

今私は人々が約束した問題のいくつかを見ています。それはまあまあです。説明してくれてありがとう。 – Connorelsea

+0

答えの2番目の部分が間違っています。 'catch 'に投げることは何にも影響しません。最新のChromeバージョンでは「未知の約束」エラーとして表示されることがありますが、Nodeネイティブの約束では表示されません。 – estus

+2

@estus「処理されていない拒否」と見なされるためには再投げ込みする必要がありますが、有用な場所にログを残すには、アプリケーションで手動でログを記録する必要があります。 Chromeはそれを自動的に実行しますが、ノードは次のようなことはしません。https://nodejs.org/api/process.html#process_event_unhandledrejection – loganfsmyth

1

実際にエラーを記録していないためですか?

export function post(req, res) { 
    console.log("Testing") 
    User.create(getFields(req, ["name_first", "name_last"])) 
    .then(user => respondJSON (res, fields, { status: 201 })) 
    .catch(err => { 
     console.error(err); 
     respondError(res, err); 
    }); 
} 
+0

ええ、私はそれを得るが、これらのようなエラーはエラーとして表示されない?私が 'console.log(x)'をChromeコンソールに入力するだけで、 'Uncaught ReferenceError:x is not defined 'とスタックトレースを得ることができます。 – Connorelsea

0

私は、メインの非同期機能を実行するために追加された 'finally'によって同様の問題が発生しました。それを修正する

run() 
.finally(()=>{process.exit(0)}) 

run() 
.catch(err => {console.log(err)}) 
.finally(()=>{process.exit(0)}) 

は、問題を解決し

関連する問題