2016-05-17 15 views
1

この問題は何時間も続きました。以下のコード:ノードJS mongooseクエリが結果を生成していません

router.route("/contact") 
    .get(function(req,res){ 
     var response = {}; 
     Contact.find({},function(err,data){ 
      if(err) { 
       response = {"error" : "Error fetching data"}; 
      } else { 
       response = {"message" : data}; 
      } 
      res.json(response); 
     }); 
    }) 

問い合わせの上では、このコードは、任意の出力を生成しないデータベース内のすべての連絡先となりますが

router.route("/contact/department/:dept") 
    .get(function(req,res){ 
     var response = {}; 
     var arrDept = req.params.dept.split(","); 
     if(arrDept.length == 0){ 
      response = {"error": " Please enter Department keywords"}; 
     } 
     else{ 
      response = {}; 
      arrDept.forEach(function(currentValue){ 
       Video.find({dept: '/'+currentValue+'/i'}, function(err, data){ 
        if(err){ 
         response[currentValue] = "No data found"; 
        }else{ 
         response[currentValue] = data; 
        } 
       }); 
      }); 
     } 
     res.json(response); 
    }); 

生成します。

コードは、他のブロックでforeachループに入っているが、私は

Video.find({},function(err, data){ 
        if(err){ 
         response[currentValue] = "No data found"; 
        }else{ 
         response[currentValue] = data; 
        } 
       }); 

のような基本的なものにJSONはまだ空白返される応答をクエリを変更しても、クエリは、任意の結果を生成されていません。

PS:実際の問題の例に過ぎないため、問題は単純化されています。私はコードに直面しています。回答後に 更新が見つかりました。

答えて

1

res.json(response);が実際のMongoDBクエリのコールバックの外側にあります。つまり、クエリのコールバックが実際に実行され、結果が空になる前にレスポンスを作成しています。

+0

DAXaholicに感謝....しかし、どのように私は応答jsonオブジェクトにループの各反復からデータを追加するのですか? –

+0

それ以上のヘルパーライブラリを使わずに実行できます。コールバックの外側の配列を結果とともに保持し、コールバックでその配列に追加します。その配列のサイズが 'arrDept'と同じになるとすぐにすべての結果が得られます。しかし、正直言って、async.jsのようなものを使う方がはるかに簡単で簡単です。私が意味することの簡単な例については、https://github.com/caolan/async#mapを参照してください。 – DAXaholic

+0

thnx ...私はついにそれを約束で解決しました。 var promise = Contact.find({dept:{$ in:arrayDept}})。 \t \t \t promise.then(関数(resultJson){ \t \t \t \t res.json(resultJson); \t \t \t})。 –

2
res.json(response) 

は、空白のjsonが返されていた理由です。上記のシナリオは、次のようにpromiseを使用して解決できます。

var promise = Contact.find({ dept: { $in: arrayDept }}).exec(); 
promise.then(function(resultJson) { res.json(resultJson); }); 

これを使用して、配列内のすべてのクエリを実行し、完全なjsonを返すことができます。

関連する問題