2017-12-18 13 views
0

ユーザーはいくつかの値のいずれかを更新するオプションを持っていますが、彼が{ name: "new name" }だけを渡すと、電子メールとパスワードのフィールドも更新されますが、 "null"になります。findOneAndUpdate()を使用する場合、値を指定しない場合(nullで上書きするのではなく)、フィールドをそのまま残す方法はありますか?

req.bodyで実際に提供されているフィールドだけを更新し、残りはそのまま残すことはできますか?

これは、POST要求で更新できるフィールドを指定している間です。これを制限したいので、req.bodyを渡すのは避けています。値が未定義ではありません「ヌル」で上書きするかどうかを確認するためにreq.body.name && req.body.name:名前のようなものを使用して

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

私のコードは次のようになります。

ありがとうございます!

答えて

0

まず、あなたの更新オブジェクトを準備します

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); 

かを、あなたのプロパティ名が一致する場合:このことについて

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

どのように?

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

あなたの要求を正確にあなたのサンプル({ name: "new name" })のように見える場合、これは望ましい効果を持っている必要があります。

+0

クライアントの代わりにサーバーにこれをコーディングすることで、どの値を更新できるかを制限したいと思っていました。そうしないと、更新を意図していない値を手動で更新することができました。 – dan674

0

受信したデータを検証する場合は、有効なすべてのフィールドを含む更新オブジェクトを作成できます。例:

// 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) 

このアップデートオブジェクトは、Mongoアップデート内で使用してください。もちろん、電子メールの書式設定やパスワードの必要性をチェックするために検証を調整したいと思うかもしれませんし、おそらく関数に入れるのがもっとクリーンですが、あなたはそのアイデアを得るでしょう。

関連する問題