findByIdAndUpdate не дает сбой, даже если тело содержит параметры, не входящие в схему - PullRequest
0 голосов
/ 03 августа 2020

Взято из Этот учебник MERN ...

У меня есть схема mon goose с 4 полями:

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

let Todo = new Schema({
    name: {
        type: String,
        required: true
    },  
    description: {
        type: String,
        required: false
    },  
    comments: {
        type: String,
        required: false
    },  
    done: {
        type: Boolean,
        required: true
    },  
});

module.exports = mongoose.model('Todo', Todo);

Я звоню по этому update route:

todoRoutes.route('/update/:id').post(function(req, res) {
    Todo.findByIdAndUpdate(req.params.id, req.body, function(err, todo) {
        if (err)
            res.status(400).send('Updating item failed: ' + err);
        else
            todo.save().then(todo => {
                res.json('Item updated!');
            }).catch(err => {
                res.status(400).send("Update not possible: " + err);
            }); 
    }); 
});

со следующим телом:

{
    "name": "bla"
}

и получает статус «ok», и документ обновляется, как я хотел. Тем не менее, запуск того же update с дополнительным полем также получает статус «ОК», хотя он должен был потерпеть неудачу. IMO:

{
    "name": "bla",
    "unwanted_field": true
}
  • Поле не отображается, когда я GET БД, но он все равно возвращается без ошибок. Почему?
  • Почему для обновления не требуются «обязательные» поля и принимаются любые обновления?

1 Ответ

0 голосов
/ 03 августа 2020

введите здесь описание ссылки имеет параметр strict, который можно использовать следующим образом:

let Todo = new Schema({
    name: {
        type: String,
        required: true
    },  
    description: {
        type: String,
        required: false
    },  
    comments: {
        type: String,
        required: false
    },  
    done: {
        type: Boolean,
        required: true
    },  
},
    { 
        strict: true // This is true by default. Changing this to "throw" will throw an error, as shown in the image attached.
    }
);

Я добавляю сюда изображение ошибки, которую я получил с помощью почтальона, пытаясь для добавления неверных данных после добавления опции strict: "throw":

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...