我有一个具有以下架构的用户模型,所有必填字段
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)
})
Front传递数据如下
{ "candidateId":"5a9a86c16acff45a8070d2da",
"name":"Superman",
}
我将得到body.age和body.country的未定义错误,因为它没有从前端传递。
问题 - 如果某些参数没有从前端发送任何值,如何使用之前的值,一种方法是发送所有内容,即使它没有更改。
答案 0 :(得分:1)
看起来您正在使用lodash,请查看omitBy以删除未定义或空属性:
_.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; }, {})
答案 1 :(得分:0)
形成一个包含已发送值的新对象:
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)...
答案 2 :(得分:0)
当我遇到这个问题时,我通常会创建一个解析器函数:
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)
})
答案 3 :(得分:0)
我正在使用以下方式来解决它,如果有任何其他更好的方法,让我知道作为答案的不良标记。
我现在传递所有数据以从像这样的新对象的前端更新
---客户数据---
{ "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)
})