2017-10-16 1 views
-1

Ich möchte console.log() die Ergebnisse einer mongodb-Datenbank-Abfrage ohne in die Mongo-Shell zu gehen. Unten ist mein Code. Die relevanten Teile sind fett gedruckt.Wie logge ich eine mongodb-Datenbankabfrage an die Konsole (nicht die Mongo-Shell)?

router.put('/quotes/:id', (req, res, next) => { 
    let personToUpdate = req.params.id; 
    **console.log("old name: " + JSON.stringify(db.collection("quotes").findOne({ _id: ObjectId(personToUpdate) })));** 
    db.collection("quotes").findOneAndUpdate( 
    { _id: ObjectId(personToUpdate)}, 
    {$set: { 
     name: req.body.name 
     } 
    }, function (err, object) { 
     if (err) { 
     console.warn(err.message); 
     } else { 
     **console.log("new name: " + req.body.name);** 
     } 
    } 
); 
}); 

Ich habe versucht:

console.dir(), aber das kehrt [object, object]. Ich habe versucht print() und printjson(), aber das sind Mongo Shell exklusive Befehle.

Das Endergebnis sollte sein, dass, wenn der Benutzer einen Namen durch eine Put-Anfrage ändert, zuerst der alte Name, der in der Datenbank gespeichert ist, an die Konsole und dann am Ende des findOneAndUpdate() mongodb -Befehls geändert wird Der Name protokolliert den neuen Namen, den der Benutzer über req.body.name

+0

Warum protokollieren Sie das Ergebnis eines asynchronen Anrufs? – lilezek

+0

Ich verstehe nicht, warum das ein Problem ist. Logging ("neuer Name:" + req.body.name) funktioniert gut. Meine Schwierigkeit besteht darin, den alten Namen zu protokollieren, der gerade in der Datenbank gespeichert ist, bevor die Änderungen vorgenommen werden. –

+0

Bitte lesen Sie, wie 'findOne' funktioniert: http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#findOne –

Antwort

2

findOne gesendet hat, async, also müssten Sie einen Rückruf bereitstellen, um das Ergebnis zu erhalten, und dann den Rest Ihres Codes in diesen Rückruf einfügen damit das Update nicht vor dem ursprünglichen Dokument ausgeführt wird.

Das ursprüngliche Dokument wird jedoch standardmäßig an den Rückruf findOneAndUpdate übergeben, sodass Sie den Anruf findOne eliminieren und den ursprünglichen Namen von dort abrufen können.

router.put('/quotes/:id', (req, res, next) => { 
    let personToUpdate = req.params.id; 
    db.collection("quotes").findOneAndUpdate( 
    { _id: ObjectId(personToUpdate)}, 
    {$set: { 
     name: req.body.name 
     } 
    }, function (err, result) { 
     if (err) { 
     console.warn(err.message); 
     } else { 
     console.log("old name: " + result.value.name); 
     console.log("new name: " + req.body.name); 
     } 
    } 
); 
}); 
+0

Sie sind unglaublich! Ich danke dir sehr! –

Verwandte Themen