2016-10-12 8 views
2

関数呼び出しからのエラーを返す際に混乱が生じます。 例として、sequelizeJSを使用してその点を説明しています。通常 :ネストされたthenと約束のエラーを返すExpressJS/NodeJs

First.Ctrl

var second_ctrl = require('../ctrl/second'); 
testCode : function(req, res, next){ 
    return second_ctrl.getData() 
      .then(function(resultData){ 
       res.json(resultData); 
      }) 
      .catch(function(error){ 
       res.json(error) 
      }) 
} 

Second.Ctrl

getData : function(){ 
    return models.Data.findAll()    
} 

のgetDataのfindAllの誤差はfirst_ctrlのブロックをキャッチするために行くだろう。しかし、私はのようないくつかの操作を行う必要がある場合:

Second.Ctrl - 実行 - 操作、私はスローエラー、リターンエラーを使用し、内側のcatchブロックを削除しますが、両方のケースで試してみました

getData : function(){ 
    return models.Data.findAll() 
      .then(function(result){ 
       if(result == null) 
        throw new Error ('No data found'); 
       return result; 
      }) 
      .catch(function(error){ 
       throw error; 
       //return error 
      }) 
} 

エラーオブジェクトを受け取ったresultDataでfirst_ctrlをブロックします。

これらのネストされたコールのような状況のこの種のためのベストプラクティスをより深く行くことができている何

(first_ctrl - > second_ctrl - > third_ctrl)

私を知ってみましょう。あなたの考えを楽しみにしています

+0

投げたときにブロックに着陸したことは確かですか?期待される振る舞いはあなたの例に似ています。外側のcatchブロックで終わるはずです(外側のブロックを常に把握したい場合は内側のcatchブロックは必要ありません)。 –

+0

でもインナーキャッチブロックを外してみましたが、first_ctrlのthenブロックで終わりです。 –

+0

@adeneo:私が約束しているように、私はqやbluebirdのような約束のライブラリを使わなければなりません。これらは通常のようには不可能です。可能であれば、スニペットでどのようにできるのか教えてください。 –

答えて

1

まだ完全な答えではありませんが、うまくいけばうまく軌道に乗るのに役立ちます。

あなたのコアアイデアは正しいです。次のコードは動作します:あなたが(あなたがres.jsonを(呼び出し)、それに気付かず、外側のcatchブロック内にある

  • :私は想像することができ

    const myPromise = Promise.reject(new Error('some error')) 
        .then(res => console.log('inner then')) 
        .catch(err => { 
        console.log('inner err'); 
        throw err 
        }) 
        .then(res => console.log('outer then')) 
        .catch(err => console.log('outer err')); 
    // logs: 
    // inner err 
    // outer err 
    

    ので、以下のことが私たちの問題の原因可能であり、あなたの外側にも同様に - どの人が呼び出されているかをどのように知っていますか)

  • あなたは約束のライブラリを使用しています。

これは少なくとも少し役立ちます。

+0

私は約束のライブラリを使用していません。私はsecond_ctrlに約束オブジェクトを作成していません。上記と同様です。私はそれが原因だと思いますか?私は約束のライブラリを使用する必要があります。右? –

+0

models.Data.findAll()は約束以外の何を返しますか?それは確かに何かを返すか、あなたのthenブロックは呼び出されません –

関連する問題