Mongoose Query Middleware

JS
S
JavaScript

Some examples of adding middleware to the query object via the schema. Only works for Mongoose 4.x+.

1// Comprehensive list of operations
2count()
3find()
4findOne()
5findOneAndRemove()
6findOneAndUpdate()
7insertMany()
8update()
9
10const schema = new mongoose.Schema({
11    value: Number
12});
13
14// Pre-find middleware
15schema.pre('find', ()=> {
16    this.where('title').gt(44); // this => query object
17});
18
19// Error handling middleware (Mongoose 4.5.x)
20schema.post('save', (error,doc,next) => {
21    if(error.name === 'MongoError' &&e error.code = 1000){
22        next(new Error('Dupicate Key'));
23    } else {
24        next(error);
25    }
26});
27
28// Example #1 =============================================================
29// item.model.ts (it's required to set strict:false, in order to use multiple versions of the model)
30const options = {
31    strict: false
32};
33const itemSchema = new mongoose.Schema({
34    name: String,
35    description: String,
36    category: String,
37    estvalue: Number
38},options)
39
40// routes/api.ts
41  app.put('/api/item/:id', function (req, res) {
42    itemUpdateMiddleware(req,res);
43  });
44
45// item.update-middleware.ts
46import * as mongoose from 'mongoose';
47import { Item } from './item.model';
48import { Schema } from 'mongoose';
49
50const itemUpdateMiddleware = (req,res) => {
51    let doc;
52
53    const callback = function(err){
54        if(err) return err;
55        res.sendStatus(200,doc)
56    };
57
58    // Add new field 'requiresInsurance'
59    if(req.body.estvalue >= 200){
60        const insuranceSchema: Schema =  Item.schema.add({
61            requiresInsurance: {
62                type: Boolean, default: true
63            }
64        }) as any;        
65
66        // extended schema x
67        const InsuredItem = mongoose.model('Item', insuranceSchema);
68
69        // check if doc already has requiresInsurance
70        if(!req.body.hasOwnProperty('requiresInsurance')) {
71            doc = new InsuredItem(req.body);    
72            doc['requiresInsurance'] = true;   
73            InsuredItem.findOneAndUpdate({_id: req.params.id},doc,callback);   
74        } else {
75            doc = req.body;
76            doc['requiresInsurance'] = true;   
77            Item.findOneAndUpdate({_id: req.params.id},doc,callback);   
78        }
79    } else {
80        const insuranceSchema =  Item.schema.add({
81            requiresInsurance: {
82                type: Boolean, default: false
83            }
84        }) as any;  
85        // extended schema
86        const InsuredItem = mongoose.model('Item', insuranceSchema);              
87        // check if doc already has requiresInsurance
88        if(req.body.hasOwnProperty('requiresInsurance')) {
89            doc = req.body;    
90            doc['requiresInsurance'] = false;   
91            InsuredItem.findOneAndUpdate({_id: req.params.id},doc,callback);   
92        }
93        if(!req.body.hasOwnProperty('requiresInsurance')) {
94            doc = req.body;    
95            Item.findOneAndUpdate({_id: req.params.id},doc,callback);   
96        }        
97    }
98}
99
100export { itemUpdateMiddleware }

Created on 1/14/2018