2017-06-16 3 views
0

wie geht es dir? Ich bin ziemlich neu zu Mungo und MongoDB und ich habe Probleme mit einer grundlegenden Abfrage. Also, ich habe diesen Code:Mungo: das Abfrageergebnis richtig erhalten

function addVoterToElection(req, res) { 
    let query = Election.findOne({ 'name' : req.body.electionName }); 
    let result = query.exec((err, election) => { 
     if(err) return err; 
     return res.send(election); 
    }); 
} 

, die wie vorgesehen funktioniert, da t die Wahl Ich muss an den Anforderer zurückschickt:

{ 
    "_id": "594408b7c94fcdc009000001", 
    "votechain": "594408b7c94fcdc009000002", 
    "name": "eleicaoteste", 
    "electionID": 12, 
    "__v": 0, 
    "voters": null 
} 

Aber die Sache ist, dass ich das Objekt verwenden müssen für andere Zwecke, und ich habe Probleme, es aus der query.exec zu extrahieren. Wenn ich

tun
let query = Election.findOne({ 'name' : req.body.electionName }); 
let result = query.exec((err, election) => { 
    if(err) return err; 
    return (election); 
}); 
res.json(result); 

alle bekomme ich wieder

{ 
    "emitted": {}, 
    "ended": false, 
    "_events": {}, 
    "_eventsCount": 2 
} 

und somit nicht in der Lage es für die nächste Abfrage zu verwenden, ich bin, die Arbeit an, die diese Wahl Objekt beruht. Was kann ich tun? Ich weiß, dass das eine ziemlich grundlegende Frage ist, aber ich bin mir nicht sicher, ob ich verstehe, wie das ganze Versprechen funktioniert. Vielen Dank!

+0

Während die akzeptierte Antwort ist richtig, ich habe Mit dem Async-Modul können Sie das gewünschte Ergebnis erzielen, wie in dieser Antwort angegeben: https://Stackoverflow.com/a/5165153/4148031 –

Antwort

-1
let query = Election.findOne({ 'name' : req.body.electionName }); 

let result = query.exec((err, election) => { 
    if(err) return err; 
    return (election); 
}); 

res.json(result); 

Abfrage läuft asynchron (im Hintergrund), während der Rest des Codes ausgeführt wird. Wenn die Abfrage ausgeführt wird, führt sie den Rückruf aus, der die Fehler und die Wahl ausführt. Wenn Sie das Ergebnis zurückgeben, ist die Ausführung noch nicht abgeschlossen, daher Ihr Problem.

Was können Sie tun, ist res.json an den Körper Ihres Rückruf zu bewegen, etwa so:

let query = Election.findOne({ 'name' : req.body.electionName }); 

query.exec((err, election) => { 
    if(err) return err; 
     res.json(election); 
}); 
+0

Was ist, wenn ich das Ergebnis von diesem Rückruf (Wahl) in einer anderen Abfrage verwenden muss? Gibt es eine Möglichkeit zu warten, bis der Rückruf ausgeführt wird, um mit dem Code fortzufahren? –

+0

Sie könnten in async/await suchen, aber es ist wahrscheinlich zu viel für das, was Sie erreichen wollen. Und findOne() gibt das Ergebnis Ihrer Abfrage nicht zurück, Sie leiten nur einen Rückruf in das Ergebnis ein, wenn das Ergebnis fertig ist. Wenn Sie also warten möchten, bis der Rest des Codes fertig ist, fügen Sie einfach den Rest des Codes, den Sie später ausführen möchten, in den Erfolgsteil des Callbacks ein. Wie wenn (err) {console.log (err)} else {// ... den Rest von Sachen}. Wenn Sie viele verschachtelte Callbacks haben, können Sie in Versprechungen schauen, aber ich würde mich zuerst mit Callbacks vertraut machen! – cheesenthusiast

0

Das Problem ist, dass Sie nicht die promise rechten Seite.

Dies ist ein guter Ort, das Lernen zu beginnen über Promises:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Die Lösung ist sehr einfach:

let query = Election.findOne({ 'name' : req.body.electionName }); 
let result = query.exec(); 

result.then((result) => { 
    res.json(result); 
}).catch((error) => { 
    // console.log(err); 
}); 

http://mongoosejs.com/docs/promises.html

+0

danke, das macht sehr viel Sinn. Ich habe das Async-Modul verwendet, aber das werde ich mir merken! –

Verwandte Themen