Обновление маршрута и модели для MongoDB либо удаляет данные, либо выдает ошибку - PullRequest
0 голосов
/ 15 марта 2019

Я некоторое время искал, и я не сталкивался с чем-то похожим на проблему, с которой я столкнулся.

Я работаю над приложением MERN-стека с четырьмя маршрутами.Три маршрута работают нормально, но мой четвертый маршрут и модель базы данных доставляют мне неприятности.

Вот модель:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

let bucketListItem = new Schema({
itemOnList: { type: String, required: true },
status: { type: String, required: true },
dateCreated: { type: Date, default: Date.now },
completed: { type: Boolean, default: false }
});

module.exports = mongoose.model("bucketListItem", 
bucketListItem);

Это JSON I 'Я использовал в Postman для тестирования функции обновления (я скопировал ее из запроса GET, поэтому он имеет _id и __v):

{
"completed": true,
"_id": "5c8b05c701eb8007dceb3aaa",
"itemOnList": "Visit Venice",
"status": "btdt.",
"dateCreated": null,
"__v": 0
}

Как вы можете видеть в модели, у меня есть четыреполя, два из которых я установил в 'обязательный: истина'.Когда я пытаюсь обновить любое из полей, например переключить true на false или изменить статус на другое сообщение, я получаю сообщение об ошибке, в котором говорится, что эти два поля обязательны для заполнения, даже если все поля содержат информацию.

сообщение об ошибке:

{
"error": {
    "errors": {
        "status": {
            "message": "Path `status` is required.",
            "name": "ValidatorError",
            "properties": {
                "message": "Path `status` is required.",
                "type": "required",
                "path": "status"
            },
            "kind": "required",
            "path": "status"
        },
        "itemOnList": {
            "message": "Path `itemOnList` is required.",
            "name": "ValidatorError",
            "properties": {
                "message": "Path `itemOnList` is required.",
                "type": "required",
                "path": "itemOnList"
            },
            "kind": "required",
            "path": "itemOnList"
        }
    },
    "_message": "bucketListItem validation failed",
    "message": "bucketListItem validation failed: status: Path `status` is required., itemOnList: Path `itemOnList` is required.",
    "name": "ValidationError"
  }
}

Теперь я попытался удалить из модели 'required: true' и больше не получаю сообщения об ошибке.

Вместо этого маршрут полностью удаляет информацию из записи базы данных, и я получаю что-то вроде этого:

{       
 "completed": false,
 "_id": "5c8b05c701eb8007dceb3aaa",
 "__v": 0,
 "dateCreated": "null"
}

Вот код моего маршрута:

blRoutes.route("/update/:id").post(function(req, res) {
BucketListItem.findById(req.params.id, function(err, 
bucketListItem) {
if (!bucketListItem) {
  res.status(404).send("Data not found.");
} else {
  bucketListItem.itemOnList = req.body.itemOnList;
  bucketListItem.status = req.body.status;
  bucketListItem.dateCreated = req.body.dateCreated;
  bucketListItem.completed = req.body.completed;

  bucketListItem
    .save()
    .then(bucketListItem => {
      res.json("Updated.");
    })
    .catch(err => {
      res.status(400).send({ error: err });
      console.log(err);
    });
  }
});
});

app.use("/bucketList", blRoutes);

И я использовал Body Parser и CORS, на случай, если кто-нибудь прочтет это по этому поводу:

app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

Надеюсь, я не сформулировал это неясным образом или не учел ничего.Если у меня есть, пожалуйста, дайте мне знать.

И заранее благодарю за помощь!

ОБНОВЛЕНИЕ:

Итак, я произвел рефакторинг (надеюсь, это правильное слово),мой маршрут, и теперь он выглядит так:

blRoutes.route("/update/:id").post(function(req, res) {
BucketListItem.findOneAndUpdate({ _id: req.params.id }, req.body, {upsert: true, returnNewDocument: true})
.then(bucketListItem => res.json(bucketListItem))
.catch(err => res.status(404).send(err));
});

(Там, где написано {upsert: true}, я также пытался {new: true}.

И янемного переделал мою модель:

let bucketListItem = new Schema({
itemOnList: { type: String, required: true },
status: { type: String, required: true },
dateCreated: { type: Date, default: Date.now() },
completed: Boolean
});

Весь остальной код остался прежним.

Что происходит, когда я запускаю этот код, документ, который я пытаюсь изменить,

{
"dateCreated": null,
"_id": "5c8b05c701eb8007dceb3aaa",
"completed": false,
"itemOnList": "Visit Venice",
"status": "Bought tickets.",
"__v": 0
}

возвращается точно так же. Ничего не изменится. Я пытаюсь изменить его на:

    {
    "completed": true,
    "_id": "5c8b05c701eb8007dceb3aaa",
    "itemOnList": "Visit Venice",
    "status": "btdt.",
    "dateCreated": null,
    "__v": 0
    }

Насколько я могу судить, код моего маршрутаправильно, но я уверен, что есть кое-что маленькое, что я просто не замечаю. Еще раз спасибо за любую помощь.

1 Ответ

1 голос
/ 15 марта 2019

Вы можете просто обновить документ с помощью этого запроса: -

BucketListItem.findOneAndUpdate(
 { _id: req.params.id },
 req.body,
 { new: true, upsert: true }
);

Кроме того, вам не нужно указывать значение по умолчанию как ложное для полей.Просто укажите тип как Boolean вместо передачи объекта с типом.

let bucketListItem = new Schema({
itemOnList: { type: String, required: true },
status: { type: String, required: true },
dateCreated: { type: Date, default: Date.now },
completed: Boolean
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...