[英]Nodejs findOneAndUpdate paramerters
我有一個具有以下架構的用戶模型,所有字段均為必填
name:String,
country:String,
age:Number
從前端我按更新按鈕並僅更新年齡字段,而在后端我有以下內容
var body = _.pick(req.body, ["candidateId","name","age","country"]);
var candidateId = mongoose.Types.ObjectId(body.candidateId);
Candidate.findOneAndUpdate({
_id:candidateId
},{
name: body.name,
country: body.country,
age: body.age,
}).then((data) => {
if (!data) {
res.status(400).send('noDataFound');
} else {
res.status(200).send(data);
}
}).catch((e) => {
res.status(500).send(e)
})
前傳數據如下
{ "candidateId":"5a9a86c16acff45a8070d2da",
"name":"Superman",
}
我將得到body.age和body.country的未定義錯誤,因為它沒有從前端傳遞。
問題-如果前端沒有為某個參數發送值,那么如何使用以前的值,一種方法是發送所有內容,即使其未更改。
看來您正在使用lodash,請檢出omitBy刪除未定義或null屬性:
_.omitBy({ foo: 'foo', bar: undefined, baz: null }, _.isNil)
{foo: "foo"}
這是一個普通的JS解決方案:
Object
.entries({ foo: 'foo', bar: undefined, baz: null })
.filter(([_, value]) => value !== null && value !== undefined)
.reduce((acc, [key, value]) => { acc[key] = value; return acc; }, {})
形成一個包含發送值的新對象:
const newObj = {};
if (body.name) {
newObj.name = body.name;
}
if (body.age) {
newObj.age = body.age;
}
if (body.country) {
newObj.country = body.country;
}
然后使用newObj
更新。
Candidate.findOneAndUpdate({
_id:candidateId
}, newObj)...
當我面對這個問題時,我通常將解析器函數創建為:
var body = _.pick(req.body, ["candidateId","name","age","country"]);
var candidateId = mongoose.Types.ObjectId(body.candidateId);
function createUpdatedValues(params) {
var condition = {};
if (params.candidateId) condition.candidateId = params.candidateId;
if (params.name) condition.name = params.name;
if (params.age) condition.age = params.age;
if (params.country) condition.country = params.country;
return condition;
}
Candidate.findOneAndUpdate({
_id:candidateId
},createUpdatedValues(body)).then((data) => {
if (!data) {
res.status(400).send('noDataFound');
} else {
res.status(200).send(data);
}
}).catch((e) => {
res.status(500).send(e)
})
我正在使用以下方法來解決它,如果還有其他更好的方法,請讓我知道不正確的答案。
我現在將所有數據從前端更新傳遞到像這樣的新對象中
---客戶數據-
{ "candidateId":"5a9a86c16acff45a8070d2da",
"updatedData":{
"firstName":"Jack",
"lastName":"Bauer",
"applicationSource":"consultant",
"skills":["trading","sales"]
}
}
----更新邏輯----
var body = _.pick(req.body, ["candidateId","updatedData"]);
var candidateId = mongoose.Types.ObjectId(body.candidateId);
var dataToUpdate = _.pick(body.updatedData,["firstName","lastName"]);
Candidate.findOneAndUpdate({
_id:candidateId
},dataToUpdate).then((data) => {
if (!data) {
res.status(400).send('noDataFound');
} else {
res.status(200).send(data);
}
}).catch((e) => {
res.status(500).send(e)
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.