2017-07-13 16 views
-1

我有兩個集合賦值和最終的值。我的代碼是這樣的錯誤:在引用集合節點時發送它們時無法設置標題js

app.post('/checkuser',function(req,res){ 

     //var id="ObjectId('"+req.body.id+"')"; 
     var mongo=require('mongodb'); 
    var ObjectID=require('mongodb').ObjectID; 
    var obj_id=new ObjectID(req.body.id); 

     //var username=req.body.username; 
     mongoClient.connect(url,function(err,db){ 
      db.collection('assign',function(err,collection){ 
       collection.findOne({"_id":obj_id},function(err,result){ 
        res.send(result); 
        db.final.findOne({"username":result.user.username},function(err,results){ 
         res.send(results); 
        }) 
       }) 
       }) 
      }) 
    }) 

的分配集合中的數據的格式如下

{ 
     "_id" : ObjectId("59674fb5a13752326c939dcd"), 
     "user" : { 
       "username" : "c", 
       "password" : "v" 
     } 
} 

,並在最終收集的數據是這樣的

{ 
     "_id" : ObjectId("59674cfc081305f9c8b5bc58"), 
     "username" : "c", 
     "name" : "MAC", 
     "asset" : "PRO", 
     "place" : "Bangalore" 
} 

我想訪問數據爲用戶名:「c」通過在分配集合中提供id。 使用上面的代碼,我得到錯誤 - 發送後無法設置標題。 執行此操作的正確方法是什麼?

+0

您需要操作對象中的結果數據,並在請求結束時發送它。 –

+0

這是如何完成的? @AnkitBalyan – Aayushi

回答

0

對於相同的res,您可以多次致電res.send()。您只能針對單個HTTP請求發送一次響應。

如果您想用多條信息做出迴應,您需要將它們以某種方式組合起來,然後將其傳遞到res.send()

+0

如何做到這一點。我需要做嵌套的ajax調用嗎? – Aayushi

+0

嘗試刪除第一個res.send()調用'res.send(result);'。這甚至可以做你正在尋找的東西。 – agm1984

0

我發現這個錯誤基本上意味着數據已經發送,然後頭部被操作。同樣,res對象不能在同一個函數中多次調用。所以,第二個查詢應該在第一個函數的成功函數中執行。

0

這裏是一個可能的解決方案:

mongoClient.connect(url,function(err,db){ 
     db.collection('assign',function(err,collection){ 
      collection.findOne({"_id":obj_id},function(err,result){ 
       db.final.findOne({"username":result.user.username},function(err, result, results){ 
        res.send({ "first": result, "second": results }); 
       }) 
      }) 
      }) 
     }) 

對不起,我無法驗證,但它的目標是做的是通過第一個結果到下一個功能,然後用兩個結果發送對象在裏面。如果它有效,至少應該讓你再次移動。

你陷入混亂的領域,因爲你的巢穴相當深。我建議學習和實踐Promises和異步/等待。旨在爲每件事物做一個功能,每個功能應該只有一個目的。你還應該研究「回撥地獄」,它是什麼以及如何避免它。

相關問題