2017-02-23 6 views
2

に未処理の約束拒否につながるV 7.5.0私は、私は、ノード6.6以降の新機能の一部を知っているが、私は理解していない事がある をDeprecationWarning UnhandledPromiseRejectionWarning & & を取得しています私はそれを変数にキャッシングした直後にその約束を捉えています。キャッシュしないと警告はスローされません。 これは、エラーをスローするコードである:verifyToken()はGoogleが認証トークンを確認し、約束を返す関数であるキャッシュ約束はnodejsを使ってNode.jsの

let verifyPromise = verifyToken(id_token); 

    verifyPromise.catch((err) => { 
     log(err); 
    }); 

    let verifyOkPromise = verifyPromise.then((login) => { 

     return DB_API.getTokenById(id_token);; 
    }); 

    verifyOkPromise.catch((err) => { 
     log('error in finding token: ', err); 
    }); 


    verifyOkPromise.then((dbRes) => { 
     log('loggin res in finding token: ', dbRes); 
    }); 

。 ノード出力は以下の通りです:

error in finding token: { CouchbaseError message: 'The key does not exist on the server', code: 13 } 
(node:10961) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): CouchbaseError: The key does not exist on the server 
(node:10961) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. 

あなたが期待どおりにログインすると約束エラー分岐が定期的にcatchedされ見ることができますが、私はまだ警告を受けるよう!!!!

私はちょうどこのようなキャッチ追加もしながら:

verifyPromise.then((login) => { 
     return DB_API.getTokenById(id_token);; 
    }).catch((err) => { 
     log('error in finding token: ', err); 
    }); 

警告が与えられていないの!!! 私は何か微妙なものを見逃していると思うが、私は何ができるか理解していない。 いくつかの手がかりはありますか? 事前に感謝

答えて

2

この問題は、それが最終的に失敗する元の約束ではないので起こっています、それはthen()です!あなたはそれが最終的に約束チェーンの解像度をトリガここthen()への呼び出しである

verifyOkPromise.then((dbRes) => { 
    log('loggin res in finding token: ', dbRes); 
}); 

の結果を格納していません。あなたは元の呼び出しからキャッチを処理しようとしていますが、失敗したチェーンです。ここにあなたがしようとしているものの3つの簡略版があります。最初はあなたのワークフローに一致します。 2番目のパターンは、これらのパターンがどのように書かれているかを示します(ただし、使用したくないパターン)。 3つ目は、パターンが正しく動作するように書き直しますが、変数に割り当てられた結果を使用します。

let Promise = require('bluebird'); 

function forceReject() { 
    return Promise.reject('deliberately failed'); 
} 

let p = forceReject('12345'); 

// This will produce an Unhandled Rejection error 
/* 
p.then(res => { console.log('succeeded: ', res); }); 
p.catch(err => { console.log('failed: ', err); }); 
*/ 

// This will work but it's not the pattern you prefer 
/* 
p.then(res => { 
    console.log('succeeded: ', res); 
}).catch(err => { 
    console.log('failed: ', err); 
}); 
*/ 

// This will also work! Note the assignment of the result of p.then()... 
let q = p.then(res => { console.log('succeeded: ', res); }); 
q.catch(err => { console.log('failed: ', err); }); 
+0

偉大な答え私は本当にポイントが不足していた。どうもありがとう。 – user1658162

1

ノード7.5を使用している場合は、async/awaitを考慮する必要があります。チャドの答えはよく書かれており、正しいではありませんが、ここで私は問題のコードを記述します。方法は次のとおりです。

async function whateverYoureDoing(id_token) { 
    const token = await verifyToken(id_token); 
    // catch will automatically propagate. 
    //You can use regular try/catch and if rethrow your own custom TokenInvalidError object 
    const dbRes = await DB_API.getTokenById(id_token); 
    console.log('loggin res in finding token: ', dbRes); 
} 

注:あなたは、もはや.catchを追加し、約束してエラーをログに記録する必要がある - それは、unhandledRejectionトラッキング機能のポイントです:)ロギングは一般に、トップレベルで行われるべきである。

+0

この方法でも動作します。私はネストしようとすると私は同じ警告を得るだろうキャッチしようとしている。多くのありがとう – user1658162

+0

{ トークン= await verifyToken(id_token); { dbRes = DB_API.getTokenById(id_token);を待ちます。 log( 'トークンを見つける際のログイン再開'、dbRes); } catch(エラー){ ログ( 'トークンを見つける際にエラーが発生しました:'、エラー); /*確認トークンを挿入*/ } } catch(エラー){ ログ(エラー); } – user1658162

関連する問題