Чтобы упростить манипулирование базой данных MongoDB, мы можем использовать пакет Mongoose NPM, чтобы упростить работу с базами данных MongoDB.

В этой статье мы рассмотрим, как использовать Mongoose для управления нашей базой данных MongoDB.

Ошибки в Pre Hooks

Мы можем вызывать ошибки в предварительных хуках разными способами.

Например, мы можем написать:

async function run() {
  const { createConnection, Schema } = require('mongoose');
  const connection = createConnection('mongodb://localhost:27017/test');
  const schema  = new Schema({
    name: { type: String, required: true },
    age: Number
  });
  schema.pre('save', (next) => {
    const err = new Error('error');
    next(err);
  });
  const Kitten = connection.model('Kitten', kittenSchema);
}
run();

передать экземпляр Error в метод next.

Также мы можем вернуть обещание:

async function run() {
  const { createConnection, Schema } = require('mongoose');
  const connection = createConnection('mongodb://localhost:27017/test');
  const kittenSchema = new Schema({
    name: { type: String, required: true },
    age: Number
  });
  schema.pre('save', (next) => {
    const err = new Error('error');
    return Promise.reject(err);
  });
  const Kitten = connection.model('Kitten', kittenSchema);
}
run();

Или можем выдать ошибку:

async function run() {
  const { createConnection, Schema } = require('mongoose');
  const connection = createConnection('mongodb://localhost:27017/test');
  const schema = new Schema({
    name: { type: String, required: true },
    age: Number
  });
  schema.pre('save', (next) => {
    throw new Error('error');
  });
  const Kitten = connection.model('Kitten', kittenSchema);
}
run();

Публикация промежуточного программного обеспечения

Промежуточное ПО Post запускается после перехваченного метода и все его промежуточное ПО до его запуска.

Например, мы можем написать:

async function run() {
  const { createConnection, Schema } = require('mongoose');
  const connection = createConnection('mongodb://localhost:27017/test');
  const schema = new Schema({
    name: { type: String, required: true },
    age: Number
  });
  schema.post('init', (doc) => {
    console.log('%s has been initialized from the db', doc._id);
  });
  schema.post('validate', (doc) => {
    console.log('%s has been validated (but not saved yet)', doc._id);
  });
  schema.post('save', (doc) => {
    console.log('%s has been saved', doc._id);
  });
  schema.post('remove', (doc) => {
    console.log('%s has been removed', doc._id);
  });
  const Kitten = connection.model('Kitten', kittenSchema);
}
run();

Мы добавили промежуточное ПО публикации для операций init, validate, save и remove, которые выполняются после указанных операций с документом.

Обработчики Async Post

Мы можем добавить асинхронные сообщения. Нам просто нужно вызвать next, чтобы перейти к следующему посту:

async function run() {
  const { createConnection, Schema } = require('mongoose');
  const connection = createConnection('mongodb://localhost:27017/test');
  const schema = new Schema({
    name: { type: String, required: true },
    age: Number
  });
  schema.post('save', (doc, next) => {
    setTimeout(() => {
      console.log('post1');
      next();
    }, 10);
  });
  schema.post('save', (doc, next) => {
    console.log('post2');
    next();
  });
  const Kitten = connection.model('Kitten', schema);
}
run();

Мы вызываем функцию next в обратном вызове setTimeout, чтобы перейти к промежуточному программному обеспечению следующей публикации.

Определите промежуточное ПО перед компиляцией моделей

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

Например, мы можем написать:

async function run() {
  const { createConnection, Schema } = require('mongoose');
  const connection = createConnection('mongodb://localhost:27017/test');
  const schema = new Schema({ name: String });
  schema.pre('save', () => console.log('pre save called'));
  const User = connection.model('User', schema);
  new User({ name: 'test' }).save();
}
run();

Мы создали схему, а затем добавили save промежуточное ПО сразу после определения схемы и до создания модели.

Таким образом, обратный вызов в методе pre будет запущен, когда мы создадим документ с моделью.

Заключение

Мы можем добавить промежуточное ПО для публикации и быть осторожными при определении модели.