2017-06-20 4 views
0

Ich bin jetzt in der Lage, Daten zu empfangen, weil Mongo Rückkehr Versprechen mir istMongoDB, Express - Cant für Versprechen warten, Versprechen {<pending>}

Diese

meine Daten
{ "_id" : ObjectId("59490a250f86a4b4e0cb75b2"), "title" : "a", "array" : [ { "_id" : ObjectId("59490a250f86a4b4e0cb75b3") } ] } 
{ "_id" : ObjectId("59490a250f86a4b4e0cb75b3"), "title" : "b", "array" : [ { "_id" : ObjectId("59490a250f86a4b4e0cb75b4") } ] } 
{ "_id" : ObjectId("59490a250f86a4b4e0cb75b4"), "title" : "c", "array" : [ { "_id" : ObjectId("59490a250f86a4b4e0cb75b5") }, { "_id" : ObjectId("59490a250f86a4b4e0cb75b6") } ] } 
{ "_id" : ObjectId("59490a250f86a4b4e0cb75b5"), "title" : "d" } 
{ "_id" : ObjectId("59490a250f86a4b4e0cb75b6"), "title" : "e", "array" : [ { "_id" : ObjectId("59490a250f86a4b4e0cb75b7") } ] } 
{ "_id" : ObjectId("59490a250f86a4b4e0cb75b7"), "title" : "f" } 

Und das ist mein MongoDB Abfrage in Mongo Shell

function insertNodes(document) { 

    var array = document.array; 

    if (array) { 
     array.forEach((innerDoc) => { 
      let foreignKey = {_id: innerDoc._id}; 
      let foreignNode = db.test3.findOne(foreignKey); 

      array[array.indexOf(innerDoc)] = insertNodes(foreignNode); 
     }); 
    } 

    return document; 
} 


var documents = db.test3.find(); 

documents.forEach((document) => { 
    document = insertNodes(document); 

    print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); 
    printjson(document); 
}); 

aber jetzt möchte ich gerne diese Abfrage auf serwer tun (weil ich möchte Daten von db erhalten)

in-Controller

so dazu ich

function insertNodes(document) { 

    var array = document.array; 

    if (array) { 
     array.forEach((innerDoc) => { 
      var foreignKey = {_id: innerDoc._id}; 
      var foreignNode = db.collection('test3').findOne(foreignKey); 
      foreignNode.then(function (data) { 
       console.log(data); 
       foreignNode = data; 
      }); 

      console.log(foreignNode); 

      array[array.indexOf(innerDoc)] = insertNodes(foreignNode); 
     }); 
    } 

    return document; 
} 


var documents = db.collection('test3').find(); 

var docs = []; 

documents.forEach((document) => { 
    docs.push(insertNodes(document)); 
}); 

res.send(docs); 

aber diese Linie

var foreignNode = db.collection('test3').findOne(foreignKey); 

Promise { <pending> } 
Promise { <pending> } 
Promise { <pending> } 
Promise { <pending> } 
Promise { <pending> } 

, nachdem ich ".then"

ist Returnning mich Refactoring füge ich noch versprechen erhalten Versprochen, aber ich kann nichts damit machen.

+0

Mögliche Duplikat [Wie gebe ich die Antwort von einem asynchronen Anruf zurück?] (Https://stackoverflow.com/questions/14220321/how-do-i-return-the-respo nse-from-an-asynchron-call) – 4castle

+0

@ 4castle Ich denke nicht, dass dies das gleiche ist, weil ich "dann" –

+0

Ich bin mit dem kanonischen Duplikat für das Problem, das Sie erleben, verknüpft, aber die erste Antwort verweist auf [diese Frage ] (https://stackoverflow.com/q/23667086/5743988), die zeigt, wie Sie Ihre Nutzung von 'then' Ergebnissen in dem gleichen Ergebnis wie keine Versprechungen überhaupt verwendet wird. – 4castle

Antwort

0

so, ich denke, das Problem war, dass ich forEach wurde mit und Karte Versprechen

https://github.com/babel/babel/issues/909

Using async/await with a forEach loop

dies ist meine Lösung zu erhalten:

db.collection('test3').find().toArray(async function (err, collection) { 

    async function insertNodes(document) { 

     var array = document.array; 

     if (array) { 

      for (let innerDoc of array) { 
       array[document.array.indexOf(innerDoc)] = await insertNodes(await db.collection('test3').findOne({_id: innerDoc._id})); 
      } 
     } 
     return document; 
    } 

    var fsdf = []; 
    for (let c of collection) { 
     fsdf.push(await insertNodes(c)) 
    } 
    res.send(fsdf) 

}); 
Verwandte Themen