[译]Mongoose指南 - 中间件
中间件是一些函数, 当document发生init, validate, save和remove方法的时候中间件发生.
中间件都是document级别的不是model级别的.
下面讲讲两种中间件pre和post
pre
一共有两种pre中间件serial和parallel 发生在被附挂方法之前
serial
serial中间件是一个一个执行的串行执行
1 2 3 4 5 | var schema = new Schema(..); schema.pre( 'save' , function (next){ //do stuff next(); }); |
parallel
并行执行
1 2 3 4 5 6 | var schema = new Schema({...}); schema.pre( 'save' , true , function (next, done){ //calling next kicks off the next middleware in parallel next(); doAsync(done); }); |
这个例子中被hooked的方法是save, 直到所有的中间件都done了save才会真正被执行
错误处理
如果中间件调用一个包含error的next, 流程会被终止, 错误会被发送到callback
1 2 3 4 5 6 7 8 9 10 | schema.pre( 'save' , function (next){ var err = new Error( 'something went wrong' ); next(err); }); //later... myDoc.save( function (err){ console.log(err.message) // something went wrong }); |
post
发生在被附挂的方法之后. post中间件不直接参与到整个流程, 所以他的callback没有next也没有done
1 2 3 4 5 6 7 8 9 10 11 12 | schema.post( 'init' , function (doc) { console.log( '%s has been initialized from the db' , doc._id); }) schema.post( 'validate' , function (doc) { console.log( '%s has been validated (but not saved yet)' , doc._id); }) schema.post( 'save' , function (doc) { console.log( '%s has been saved' , doc._id); }) schema.post( 'remove' , function (doc) { console.log( '%s has been removed' , doc._id); }) |
注意了!!!
如果更新操作直接发生在数据库上pre和post不会被调用, 包含Model.update, findByIdAndUpdate, findOneAndUpdate, findOneAndRemove, findByIdAndRemove
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步