2017-12-30 44 views
2

私はNode.jsとExpressJSを使用してサーバーをコーディングしています。私のデータベースはMongooseJSをミドルウェアとして使用するMongoDBです。カスタムマングースクエリー機能を作成することはできますか?

サーバーには多くのエンドポイントがあり、ほとんどすべてのエンドポイントで同じコードが使用されます。選択した部屋に割り当てられたデバイスを取得するためのクエリです。簡体字、コードを繰り返すことは以下の通りです:

Room 
     .findOne({ _id: roomId }) 
     .populate({ 
      path: "deviceGroups", 
      populate: { 
       path: "devices" 
      } 
     }) 
     .exec(() => { 
      Device.findOne({ _id: deviceId }).exec((err, device) => { 
       if (err) { 
        res.send(err); 
       } else { 
        // do anything you need with the results here 
       } 
      }); 
     }); 

私は、クエリは非同期であることを知っているので、私は、クエリの結果で何かをしたい場合、私は、クエリのコールバック関数の中でそれをしなければなりません。また、クエリを外部関数に抽出する際には、明示的な 'resオブジェクトを渡す方法はないと思いますか?クエリ中の潜在的なエラーを処理する必要があります。

私の質問は:asyncysmについての上記の情報を考慮すると、以下のようなカスタム関数を作成することができますか。関数の呼び出しの結果を、いくつかの変数に割り当てることができます。私はそれがすべて可能であるかどうか、それはいくつかのJSの約束ハンドラでラップする必要があります、右か?

私が達成したいのは、繰り返しコードの量を減らすことです。

プロトタイプ機能:

const getDevice = (roomId, deviceId) => { 
    Room 
     .findOne({ _id: roomId }) 
     .populate({ 
      path: "deviceGroups", 
      populate: { 
       path: "devices" 
      } 
     }) 
     .exec(() => { 
      Device.findOne({ _id: deviceId }).exec((err, device) => { 
       return device; 
      }); 
     }); 
}; 

答えて

1

Room.execがすでにthencatch

function getDivice(roomId){ 
    return new Promise(
    (resolve,reject)=> 
     Room 
     .findOne({ _id: roomId }) 
     .populate({ 
      path: "deviceGroups", 
      populate: { 
       path: "devices" 
      } 
     }) 
     .exec(() => { 
      Device.findOne({ _id: deviceId }).exec((err, device) => { 
       if (err) { 
        reject(err); 
       } else { 
       resolve(device); 
        // do anything you need with the results here 
       } 
      }); 
     }) 
); 
} 

//call it like this: 
getDivice(someid) 
.then(
    divice=>{ 
    //do something with divice 
    } 
) 
.catch(
    err=>{ 
    //do something with the error 
    } 
) 
+0

ありがとうを持っているものを返さない場合は、約束を作成することができます!すべて正常に動作します! –

関連する問題