Spec-Zone.ru › Mongoose

Типы пользовательских схем

Создание базового типа пользовательской схемы

Новое в Mongoose 4.4.0: Mongoose поддерживает пользовательские типы. Однако перед использованием пользовательского типа следует помнить, что он избыточен для большинства случаев. Большинство базовых задач можно выполнить с помощью пользовательских геттеров/сеттеров, виртуальных свойств и вложенных документов.

Давайте рассмотрим пример базового типа схемы: 1-байтовое целое число. Чтобы создать новый тип схемы, нужно унаследовать от mongoose.SchemaType и добавить соответствующее свойство в mongoose.Schema.Types. Единственный метод, который нужно реализовать, — это метод cast().

class Int8 extends mongoose.SchemaType {
  constructor(key, options) {
    super(key, options, 'Int8');
  }

  // `cast()` takes a parameter that can be anything. You need to
  // validate the provided `val` and throw a `CastError` if you
  // can't convert it.
  cast(val) {
    let _val = Number(val);
    if (isNaN(_val)) {
      throw new Error('Int8: ' + val + ' is not a number');
    }
    _val = Math.round(_val);
    if (_val < -0x80 || _val > 0x7F) {
      throw new Error('Int8: ' + val +
        ' is outside of the range of valid 8-bit ints');
    }
    return _val;
  }
}

// Don't forget to add `Int8` to the type registry
mongoose.Schema.Types.Int8 = Int8;

const testSchema = new Schema({ test: Int8 });
const Test = mongoose.model('CustomTypeExample', testSchema);

const t = new Test();
t.test = 'abc';
assert.ok(t.validateSync());
assert.equal(t.validateSync().errors['test'].name, 'CastError');
assert.equal(t.validateSync().errors['test'].message,
  'Cast to Int8 failed for value "abc" (type string) at path "test"');
assert.equal(t.validateSync().errors['test'].reason.message,
  'Int8: abc is not a number');

© 2010 LearnBoost
Licensed under the MIT License.
https://mongoosejs.com/docs/customschematypes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API