2016-03-27 3 views
1

ユーザーがいるアプリケーションでNodeJSとMongooseを使用しています。また、リクエストに応じて、サーバーが特定のユーザーに対して行う多くの操作があります。あなたが見ることができるようにNodeJS/Mongooseでこのコードの重複を減らすには

User.findOne({'email':req.user.email}, function (err, user) { 
if (err) { 
    console.log('err'); 
    res.send('Error'); 
} 
if(!user){ 
    console.log('err'); 
    res.send('Error'); 
} 

// do something with returned user 
user.data = .... 
... 

user.save(function(err) { 
    if(err) { 
    console.log('err'); 
    res.send('Error'); 
} 
else { 
    console.log('success'); 
    res.send('Success'); 
} 

}

、複製コードがたくさんある:意味

、私は多くの機能に登場する、この特定のコードの断片を持っています。変更されるコードは、「返されたユーザーと何かする」部分です。他のほとんどすべて(エラーメッセージなど)は同じままです。

この部分をどのように抽出できますか?これはコールバック機構で動作しているので、これを達成するための方法はありますか?

+5

代わりに、['.update()'](http://mongoosejs.com/docs/api.html#model_Model.update)を使用してください。 '.findOne()'を使うと、 '.save()'を操作してから呼び出すことは帯域幅を噛み砕くことでかなり遅くなります。より広い問題ですが、その1つのコールを適切に適用する方法を検討するだけで、多くの定型文を保存するだけでなく、他にも多くのメリットがもたらされます。 –

答えて

1

1つの方法は約束を使用することです。コールバックを使用する代わりにMongooose APIをPromisesに変換する方法を見つけることが必要になります。その後、あなたは

User.findOne(...) 
    .then((user) => { 

     // do something with the returned user 

     return user.save(); 
    }).then(() => { 
     console.log('success'); 
     res.send('Success'); 
    }).catch(() => { 
     console.log('err'); 
     res.send('Error'); 
    }); 

約束はあなたがブロックキャッチしようとするので、唯一のエラー処理の場所を必要と同種のエラーを伝播することができる場所同期の伝統的なコーディング似ている

のラインをたどるコードを作成することができます。この方法では、複数の場所で console.log('err'); res.send('Error');行を複製する必要はありません。

たとえば、約束の紹介を"Promises - A Gentle Introduction"で読むことができます。 MongooseをPromisesに変換するために、既存のモジュールがあるかもしれません。あるいは、APIが使用する別のアプローチは、最後の引数としてコールバック関数を与えず、代わりにPromiseが返されることです。残念ながら、私はこの特定のMongoose APIに正確な知識はありません。

関連する問題