Чтобы упростить манипулирование базой данных 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
будет запущен, когда мы создадим документ с моделью.
Заключение
Мы можем добавить промежуточное ПО для публикации и быть осторожными при определении модели.