Я некоторое время искал, и я не сталкивался с чем-то похожим на проблему, с которой я столкнулся.
Я работаю над приложением 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
}
Насколько я могу судить, код моего маршрутаправильно, но я уверен, что есть кое-что маленькое, что я просто не замечаю. Еще раз спасибо за любую помощь.