2016-05-27 8 views
1

次のコードから返されませんでした。(ノード:5540)警告:約束はハンドラで作成されましたが、それ

function handleError(res, statusCode) { 
    statusCode = statusCode || 500; 
    return function(err) { 
    res.status(statusCode).send(err); 
    }; 
} 

function respondWithResult(res, statusCode) { 
    statusCode = statusCode || 200; 
    return function(entity) { 
    if (entity) { 
     res.status(statusCode).json(entity); 
    } 
    }; 
} 


// Creates a new Store in the DB 
export function create(req, res) { 
    // create user 
    let user = req.body.user; 
    let store = req.body.store; 

    auth.hash(user.password) 
    .then(hash => { 
     user.password = hash; 
     // Create user, then create store, attach store object id to user, and attach user object id to store 
     User.create(user) 
     .then(userRes => { 
     store.owner = userRes._id; 
     store.memebers = []; 
     store.memebers.push(store.owner); 

     Store.create(store) 
     .then(storeRes => { 
      return respondWithResult(res, 201); 
     }) 
     .catch(err => handleError(err)); 
     }) 
     .catch(err => handleError(err)); 
    }) 
    .catch(err => handleError(err)); 
} 

プリントタイトルで説明したエラー、「(ノード:5540)警告:約束はハンドラで作成されましたが、返されませんでした。私はコードを変更して調整しようとしましたが、エラーは依然として続きます。

+0

あなたは 'return auth.hash'を試みましたか? –

+0

今は試しましたが、残念ながらそれは同じエラーを生成しました。 –

+0

実際には返されていない約束がたくさんあります。それは単なる警告ですが、誤りである可能性があります。 – MinusFour

答えて

1

この警告は、コードが.then()ハンドラ内に約束を作成していて、ハンドラから返さないためです。

変更:

return User.create(user) 

そして、変更:

User.create(user) 

Store.create(store) 

return Store.create(store) 
.then()ハンドラ内で作成されたこれらの約束を返さないと、それらは独立した独立した約束チェーンとなり、前の約束チェーンにリンクされません。これは通常、ブルーバードが警告を出すプログラミングミスです。

返却すると、約束チェーンに追加されます。したがって、親約束はチェーンを続ける前に完了を待ちます。


私はまた、あなたはおそらく変更することをお勧めしたい:

auth.hash(user.password) 

へ:

return auth.hash(user.password) 

すべてが行われたときにcreate()の呼び出し側が言うことができるようにするため。


そして、最高レベルで1つの.catch()ハンドラが必要です。拒否された約束事はあなたのために最高レベルまで自動的に伝播します(約束事をより簡単に使用するとエラー処理をするものの1つです)。

+0

偉大な答え:-)、ありがとう。 –

-1

これは、リクエストに戻らないときの警告メッセージです。もちろんこれはもう一つの警告に過ぎませんが、大規模なアプリケーションで作業する場合、これは非常に大きな頭痛になります。これはメモリリークにつながり、アプリケーションを再起動するまでメモリを解放しないためです。

あなたはまた、他たstatmentsのために返却する必要があります。すべてのケースでは、あなたの要求に

function respondWithResult(res, statusCode) { 
    statusCode = statusCode || 200; 
    return function(entity) { 
    if (entity) { 
     res.status(statusCode).json(entity); 
    }else{ 
     //you should write an else statement also 
     //maybe something like this 
     res.status(statusCode).send(err);   
    } 
    }; 
} 

戻ります。

+0

なぜ私は-1を持っているのですか? – Miqe

+1

あなたの答えは、質問された質問と全く関係がないためです。 – jfriend00

+0

あなたは基本的に同じことをしました。「User.create(user)User.create(user)」を返すと、User.create(user)が返されます。 – Miqe

関連する問題