Mon goose findOneAndUpdate не будет обновлять мою базу данных - PullRequest
1 голос
/ 30 марта 2020

Я учу себя NodeJS, работая над приложением. Я использую Mon goose и Ax ios.

. В одном разделе приложения я отображаю партнеров, и когда я нажимаю на обновление, я получаю форму с информацией о выбранном партнере, чтобы обновить их .

Клиентская сторона отправляет информацию на сервер, но сервер не будет обновлять записи в базе данных. Вот моя сторона сервера

app.post("/api/partner/update", (req, res) => {
const id = req.body.id;
const fullname = req.body.fullname;
const email = req.body.email;
const phones = req.body.phones;
const shops = req.body.shops;
const company = req.body.company;

console.log("The body is ",req.body) //It returns the correct data from the client's side submited data

Partner.findOneAndUpdate(id, mongoose.set('useFindAndModify', false),
 {
    "fullname": fullname,
    "email": email,
    "phones": phones,
    "shops":shops,
    "company": company
  },
  (err, document) => {
    if (err) return err;
    //console.log(document);
    res.send({ document });  

  }
);});

Вот моя модель:

 const mongoose = require("mongoose");

const partnerSchema = mongoose.Schema(
  {
    fullname: {
      type: String,
      maxlength: 50,
      required: true
    },
    email: {
      type: String,
      trim: true,
      unique: 1,
      required: true
    },
    phones: {
      type: Array
    },
    company: {
      type: String,
      maxlength: 50,
      required: true
    },
    shops: {
      type: Array,
      default: 0
    },
    is_valid: {
      type: Boolean
    },
    validated_by: {
      type: String
    },

    created_by: {
      type: String,
      maxlength: 50
    },
    updated_by: {
      type: String
    },
    deleted_by: {
      type: String
    },
    deleted_at: {
      type: Date,
      default: null
    }
  },
  {
    timestamps: {
      createdAt: "created_at",
      updatedAt: "updated_at"
    }
  }
);

const Partner = mongoose.model("Partner", partnerSchema)
module.exports ={Partner}

Я не понимаю, почему она не обновляет поля в базе данных

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Это синтаксис для findOneAndUpdate согласно документам:

var query = { name: 'borne' };
Model.findOneAndUpdate(query, { name: 'jason bourne' }, options, callback)

Измените запрос в БД на:

let query = {_id: id };
let dataToUpdate= {
    "fullname": fullname,
    "email": email,
    "phones": phones,
    "shops":shops,
    "company": company
  }
let options = {useFindAndModify: false}  // useFindAndModify set to false at query level
// options = {useFindAndModify: false,new:true} if you want updated docs in return


 Partner.findOneAndUpdate(query,dataToUpdate,options,(err, document) => {
        if (err) return err;
        //console.log(document);
        res.send({ document });  

      }
    )

Чтобы включить или отключить предупреждения об устаревании в понедельник goose опция использования уровня

mongoose.set('useFindAndModify', false)

Подробнее здесь:

Предупреждения об устаревании

findOneAndReplace

Вы также можете использовать метод findByIdAndUpdate:

Model.findByIdAndUpdate(id, update, options, callback)

Вы можете включить обещания, чтобы сделать код более читабельным и тестируемым: https://mongoosejs.com/docs/promises.html

1 голос
/ 30 марта 2020

Ссылаясь на do c, https://mongoosejs.com/docs/tutorials/findoneandupdate.html первый параметр findOneAndUpdate должен быть объектом фильтра, а не идентификатором напрямую.

Поэтому, пожалуйста, попробуйте Partner.findOneAndUpdate({'_id': id},....

...