Mongoose中间件:node-express-boilerplate数据处理钩子
【免费下载链接】node-express-boilerplate A boilerplate for building production-ready RESTful APIs using Node.js, Express, and Mongoose 项目地址: https://gitcode.***/gh_mirrors/no/node-express-boilerplate
Mongoose中间件(Middleware)是MongoDB数据模型的生命周期钩子,允许在文档保存、查询、删除等操作前后注入自定义逻辑。在node-express-boilerplate项目中,中间件被广泛用于数据验证、密码加密、JSON序列化等核心场景,确保数据处理的安全性和一致性。
中间件类型与执行时机
Mongoose中间件分为pre(前置)和post(后置)两种类型,分别在操作执行前后触发。项目中主要使用以下钩子:
-
文档中间件:作用于单个文档,如
save、validate -
查询中间件:作用于查询操作,如
find、updateOne - 聚合中间件:作用于聚合管道操作
// 前置钩子示例(保存前加密密码)
userSchema.pre('save', async function(next) {
if (this.isModified('password')) {
this.password = await bcrypt.hash(this.password, 8);
}
next();
});
核心中间件实现解析
1. 密码自动加密中间件
用户模型通过pre('save')钩子实现密码加密,确保存储的密码始终经过哈希处理:
// [src/models/user.model.js](https://link.gitcode.***/i/d63301a75d077555bd36708c515ec9f0)
userSchema.pre('save', async function(next) {
const user = this;
if (user.isModified('password')) { // 仅在密码变更时加密
user.password = await bcrypt.hash(user.password, 8); // 使用bcrypt算法
}
next();
});
2. JSON序列化插件
toJSON插件作为后置钩子,自动处理文档转换:
// [src/models/plugins/toJSON.plugin.js](https://link.gitcode.***/i/51b3377fc7a8935f6d2cd3e9c8d73da6)
schema.options.toJSON = {
transform(doc, ret) {
// 删除私有字段(如密码)
Object.keys(schema.paths).forEach(path => {
if (schema.paths[path].options.private) {
deleteAtPath(ret, path.split('.'), 0);
}
});
ret.id = ret._id.toString(); // 转换ObjectId为字符串ID
delete ret._id;
delete ret.__v;
}
};
项目中的中间件应用场景
数据验证与清洗
通过pre('validate')钩子在数据验证阶段进行额外检查:
// 用户邮箱格式验证([src/models/user.model.js](https://link.gitcode.***/i/d63301a75d077555bd36708c515ec9f0))
email: {
type: String,
required: true,
validate(value) {
if (!validator.isEmail(value)) {
throw new Error('Invalid email');
}
}
}
软删除实现
虽然项目未直接实现软删除,但可通过中间件扩展:
// 软删除中间件示例
schema.pre('find', function() {
this.where({ isDeleted: false });
});
schema.pre('findOne', function() {
this.where({ isDeleted: false });
});
中间件最佳实践
-
异步处理:使用
async/await确保异步操作完成后再调用next() -
条件执行:通过
isModified()判断字段变更,避免不必要处理 -
错误处理:在中间件中捕获异常并传递给
next(err) - 插件封装:如toJSON和paginate插件,实现中间件复用
// 条件执行示例(仅修改时执行)
if (this.isModified('email')) {
// 邮箱变更逻辑
}
调试与排障技巧
- 使用
console.log(this)打印当前文档状态 - 通过
schema.get('pre')查看已注册的前置钩子 - 利用
mongoose.set('debug', true)开启调试模式
# 启用Mongoose调试
mongoose.set('debug', true);
总结
Mongoose中间件为node-express-boilerplate提供了灵活的数据处理机制,通过用户模型中的密码加密、插件系统的JSON转换等实现,构建了安全可靠的数据处理管道。合理使用中间件可以显著减少重复代码,提升系统可维护性。
后续可探索的高级场景:事务管理中间件、数据变更日志记录、多租户数据隔离等。
【免费下载链接】node-express-boilerplate A boilerplate for building production-ready RESTful APIs using Node.js, Express, and Mongoose 项目地址: https://gitcode.***/gh_mirrors/no/node-express-boilerplate