Mongoose 中的中间件功能详解

Mongoose 是一个优秀的 Node.js ORM 框架,它提供了很多强大的功能,其中之一就是中间件。中间件是一种在执行某个操作之前或之后执行的函数。在 Mongoose 中,我们可以使用中间件来增强模型的功能,例如在保存文档之前进行验证、在删除文档之前进行操作等等。

中间件的分类

在 Mongoose 中,中间件分为以下四种:

  1. document middleware:文档中间件,用于在文档级别触发事件。
  2. model middleware:模型中间件,用于在模型级别触发事件。
  3. aggregate middleware:聚合中间件,用于在聚合级别触发事件。
  4. query middleware:查询中间件,用于在查询级别触发事件。

document middleware

文档中间件是在文档级别触发的中间件,它们可以在文档保存、更新、删除等操作之前或之后执行。在 Mongoose 中,文档中间件分为以下四种:

  1. init:在文档实例化之后触发。
  2. validate:在文档验证之前触发。
  3. save:在文档保存之前触发。
  4. remove:在文档删除之前触发。

下面是一个使用文档中间件的示例代码:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  password: String,
});

userSchema.pre('save', function (next) {
  console.log('before save');
  next();
});

const User = mongoose.model('User', userSchema);
const user = new User({ name: 'John Doe', email: 'john@example.com', password: '123456' });

user.save((err) => {
  if (err) {
    console.log(err);
  } else {
    console.log('saved');
  }
});

在上面的代码中,我们使用了 pre 方法来注册一个在保存文档之前执行的中间件。在这个中间件中,我们打印了一条信息,然后调用了 next 方法,表示中间件执行完毕。当我们执行 user.save 方法时,会先执行这个中间件,然后再保存文档。

model middleware

模型中间件是在模型级别触发的中间件,它们可以在模型创建、删除等操作之前或之后执行。在 Mongoose 中,模型中间件分为以下两种:

  1. init:在模型实例化之后触发。
  2. remove:在模型删除之前触发。

下面是一个使用模型中间件的示例代码:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  password: String,
});

userSchema.pre('remove', function (next) {
  console.log('before remove');
  next();
});

const User = mongoose.model('User', userSchema);

User.deleteMany({}, (err) => {
  if (err) {
    console.log(err);
  } else {
    console.log('removed');
  }
});

在上面的代码中,我们使用了 pre 方法来注册一个在删除模型之前执行的中间件。在这个中间件中,我们打印了一条信息,然后调用了 next 方法,表示中间件执行完毕。当我们执行 User.deleteMany 方法时,会先执行这个中间件,然后再删除模型。

aggregate middleware

聚合中间件是在聚合级别触发的中间件,它们可以在聚合查询之前或之后执行。在 Mongoose 中,聚合中间件分为以下两种:

  1. initialize:在聚合实例化之后触发。
  2. execute:在聚合查询之前触发。

下面是一个使用聚合中间件的示例代码:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  password: String,
});

const User = mongoose.model('User', userSchema);

User.aggregate()
  .match({ name: 'John Doe' })
  .pre('execute', function (next) {
    console.log('before execute');
    next();
  })
  .exec((err, result) => {
    if (err) {
      console.log(err);
    } else {
      console.log(result);
    }
  });

在上面的代码中,我们使用了 pre 方法来注册一个在聚合查询之前执行的中间件。在这个中间件中,我们打印了一条信息,然后调用了 next 方法,表示中间件执行完毕。当我们执行 User.aggregate 方法时,会先执行这个中间件,然后再进行聚合查询。

query middleware

查询中间件是在查询级别触发的中间件,它们可以在查询操作之前或之后执行。在 Mongoose 中,查询中间件分为以下两种:

  1. count:在查询数量之前触发。
  2. find:在查询文档之前触发。

下面是一个使用查询中间件的示例代码:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  password: String,
});

const User = mongoose.model('User', userSchema);

User.find({})
  .pre('find', function (next) {
    console.log('before find');
    next();
  })
  .exec((err, result) => {
    if (err) {
      console.log(err);
    } else {
      console.log(result);
    }
  });

在上面的代码中,我们使用了 pre 方法来注册一个在查询文档之前执行的中间件。在这个中间件中,我们打印了一条信息,然后调用了 next 方法,表示中间件执行完毕。当我们执行 User.find 方法时,会先执行这个中间件,然后再进行查询操作。

总结

中间件是 Mongoose 中一个非常强大的功能,它可以让我们在执行某个操作之前或之后执行一些操作,从而增强模型的功能。在使用中间件时,我们需要注意中间件的分类和注册方式,以及中间件的执行顺序和调用方式。希望本文能够帮助大家更好地理解和使用 Mongoose 中的中间件功能。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658b704aeb4cecbf2d0b5c0d


纠错
反馈