Проверка минимального и максимального числа в мангусте - PullRequest
0 голосов
/ 21 ноября 2018

Я реализую веб-приложение, используя стек MEAN с Angular 6. Там я хочу найти и сохранить 'eValue's.Там минимальное значение равно 0, а максимальное значение равно 1000. Для этого я установил минимальное значение 0 и максимальное значение 1000 в схеме.Но когда я ввожу -1 и нажимаю кнопку «сохранить», он сохраняет -1 в моноблоке.То, что я хочу, если я ввожу значения меньше 0, это не должно ничего сохранять в базе данных.Вот моя схема.

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

// Schema for extruded height panel
var eValueSchema = new mongoose.Schema({
    userName: {
        type: String
    },
    eValue: {
        type: Number,
        min: 0,


    }, 
});

module.exports = mongoose.model('eValue', eValueSchema);

Это мой пост маршрут

var eValue= require('../../../models/mongoModels/eValue');

router.post("/save", function (req, res) {
    var mod = new eValue(req.body);
    eValue.findOneAndUpdate(
        {
            userName: req.body.userName,
        },

        req.body,
        { upsert: true, new: true },

        function (err, data) {
            if (err) {
                console.log(err);
                res.send(err);
            } else {

                res.send(mod);
            }
        }
    );
});

1 Ответ

0 голосов
/ 21 ноября 2018

Поскольку вы используете findOneAndUpdate(), и по умолчанию он не запускает валидаторы или значения по умолчанию.

Вам необходимо добавить параметры метода вместе с new и upsert:

 {
    upsert: true,
    new: true,
    runValidators: true,
    setDefaultsOnInsert: true
  }

Для демонстрации:

const { Schema } = mongoose = require('mongoose');

const uri = 'mongodb://localhost:27017/test';
const opts = { useNewUrlParser: true };

// sensible defaults
mongoose.set('debug', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);

// Schema defs

const testSchema = new Schema({
  name: String,
  value: { type: Number, min: 0, max: 1000, default: 0 }
});

const Test = mongoose.model('Test', testSchema);

// log helper

const log = data => console.log(JSON.stringify(data, undefined, 2));

(async function() {

  try {

    const conn = await mongoose.connect(uri, opts);

    // Clean models
    await Promise.all(
      Object.entries(conn.models).map(([k,m]) => m.deleteMany())
    )

    // Do something

    // Set validators and defaults
    let result1 = await Test.findOneAndUpdate(
      { name: 'Bill' },
      { name: 'Bill' },
      {
        upsert: true,
        new: true,
        runValidators: true,
        setDefaultsOnInsert: true
      }
    );
    log(result1);

    // No validator and no default
    let result2 = await Test.findOneAndUpdate(
      { name: 'Ted' },
      { name: 'Ted' },
      {
        upsert: true,
        new: true,
      }
    );
    log(result2);

    // Expect to fail
    try {
      let result3 = await Test.findOneAndUpdate(
        { name: 'Gary' },
        { name: 'Gary', value: -1 },
        {
          upsert: true,
          new: true,
          runValidators: true,
          setDefaultsOnInsert: true
        }
      );
      log(result3);
    } catch(e) {
      console.error(e)
    }

    console.log('Tests done!');


  } catch(e) {
    console.error(e)
  } finally {
    mongoose.disconnect()
  }

})()

Мы ожидаем, что свойство будет работать для первого действия, но второе действие фактически не будет вставлять значение по умолчанию.Обратите внимание, что «журнал» результата документа Mongoose фактически показывает 0, хотя вы можете видеть, что он не был сохранен в базе данных.

В последнем примере мы включаем валидаторы и получаем ожидаемую валидациюошибка.Удаление опции приведет к тому, что ошибка не будет выдана.

Пример вывода:

Mongoose: tests.deleteMany({}, {})
Mongoose: tests.findOneAndUpdate({ name: 'Bill' }, { '$setOnInsert': { __v: 0, value: 0, _id: ObjectId("5bf52c1b9d265f1507f94056") }, '$set': { name: 'Bill' } }, { upsert: true, runValidators: true, setDefaultsOnInsert: true, remove: false, projection: {}, returnOriginal: false })
{
  "value": 0,
  "_id": "5bf52c1b9d265f1507f94056",
  "name": "Bill",
  "__v": 0
}
Mongoose: tests.findOneAndUpdate({ name: 'Ted' }, { '$setOnInsert': { __v: 0 }, '$set': { name: 'Ted' } }, { upsert: true, remove: false, projection: {}, returnOriginal: false })
{
  "value": 0,
  "_id": "5bf52c1b97f623c9da4341a0",
  "name": "Ted",
  "__v": 0
}
{ ValidationError: Validation failed: value: Path `value` (-1) is less than minimum allowed value (0).
    ... rest of stack ...
    at ValidationError.inspect     at formatValue (util.js:561:31)
    at inspect (util.js:371:10)
    at Object.formatWithOptions (util.js:225:12)
    at Console.(anonymous function) (console.js:193:15)
    at Console.warn (console.js:210:31)
    at /home/neillunn/working/minmax/index.js:75:15
    at process._tickCallback (internal/process/next_tick.js:68:7)
  errors:
   { value:
      { ValidatorError: Path `value` (-1) is less than minimum allowed value (0).
          at new ValidatorError         message: 'Path `value` (-1) is less than minimum allowed value (0).',
        name: 'ValidatorError',
        properties: [Object],
        kind: 'min',
        path: 'value',
        value: -1,
        reason: undefined,
        [Symbol(mongoose:validatorError)]: true } },
  _message: 'Validation failed',
  name: 'ValidationError' }
Tests done!
...