2017-12-18 4 views
0

Der Benutzer hat die Möglichkeit, einige Werte zu aktualisieren. Wenn er jedoch nur { name: "new name" } übergibt, werden die Felder für E-Mail und Kennwort ebenfalls aktualisiert, jedoch auf "null".Bei der Verwendung von findOneAndUpdate(): Wie belässt man Felder so, wie sie sind, wenn kein Wert angegeben wird (anstatt mit Null zu überschreiben)?

Wie kann ich nur die Felder aktualisieren, die tatsächlich in req.body zur Verfügung gestellt werden und den Rest so lassen, wie sie sind?

Dies ist, während immer noch angeben, welche Felder mit einer POST-Anfrage aktualisiert werden können - ich habe vermieden, nur in req.body übergeben, weil ich dies begrenzen möchte.

Mein Code sieht so aus:

db.User.findOneAndUpdate({_id: req.params.id}, { 
     name: req.body.name, 
     email: req.body.emaill, 
     password: req.body.password 
}) 

etwas wie Name: req.body.name && req.body.name zu überprüfen, ob ein Wert auch nicht undefiniert ist überschrieben mit „null“.

Danke!

Antwort

0

Bereiten Sie Ihre Update-Objekt zuerst:

let params = { 
     name: req.body.name, 
     email: req.body.emaill, 
     password: req.body.password 
}; 

for(let prop in params) if(!params[prop]) delete params[prop]; 

db.User.findOneAndUpdate({_id: req.params.id}, params); 

Oder, wenn Ihr Eigenschaftsnamen entsprechen:

let params = {}; 

for(let prop in req.body) if(req.body[prop]) params.[prop] = req.body[prop]; 

db.User.findOneAndUpdate({_id: req.params.id}, params); 
0

Wie wäre das?

db.User.findOneAndUpdate({_id: req.params.id}, req.body) 

Wenn Ihre Anfrage genau wie in Ihrer Probe aussieht ({ name: "new name" }), dann sollte dies die gewünschte Wirkung haben.

+0

Ich wollte beschränken, welche Werte aktualisiert werden könnten, indem Sie dies auf dem Server anstelle des Clients kodieren - sonst könnte jemand einige Post-Anforderungen manuell senden, um Werte zu aktualisieren, die nicht aktualisiert werden sollten. – dan674

0

Wenn Sie die empfangenen Daten validieren möchten, können Sie das Aktualisierungsobjekt mit allen gültigen Feldern erstellen. Zum Beispiel:

// Example post 
const req = { 
    body: { 
     name: "First Last", 
     email: "[email protected]", 
     somethingElse: "I snuck in another update!" 
    } 
} 

// Create update obj 
const update = {} 

// Destrcture the body to make if statments smaller to read 
const {name,email,password} = req.body 

// Test all values and add valide ones to update 
if(name !== undefined && typeof name === 'string') { 
    update.name = name 
} 

if(email !== undefined && typeof name === 'string') { 
    update.email = email 
} 

if(password !== undefined && typeof password === 'string') { 
    update.password = password 
} 

console.log(update) 

Verwenden Sie jetzt dieses Update-Objekt in Ihrem Mongo-Update. Natürlich möchten Sie die Validierungen anpassen, um nach Dingen wie E-Mail-Formatierung oder Passwort-Anforderungen zu suchen, und wahrscheinlich sauberer, um sie in eine Funktion zu bringen, aber Sie bekommen die Idee.

Verwandte Themen