簡體   English   中英

Node.js findOneAndUpdate參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM