Nodejs findOneAndUpdate参数

问题描述 投票:0回答:4

我有一个具有以下模式的用户模型,所有字段都是必需的

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的未定义错误,因为它没有从前端传递。

问题 - 如果没有为某些参数从前端发送值,如何使用先前的值,一种方法是即使未更改也发送所有内容。

node.js mongoose
4个回答
1
投票

看起来你正在使用lodash,请查看omitBy以删除undefined或null属性:

_.omitBy({ foo: 'foo', bar: undefined, baz: null }, _.isNil)
{foo: "foo"}

这是一个vanilla JS解决方案:

Object
  .entries({ foo: 'foo', bar: undefined, baz: null })
  .filter(([_, value]) => value !== null && value !== undefined)
  .reduce((acc, [key, value]) => { acc[key] = value; return acc; }, {})

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

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

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)
    })
© www.soinside.com 2019 - 2024. All rights reserved.