Mongoose Project Example


Example project of using ds-express-errors

Below is an example of a simple Express application using Mongoose as the database ORM. It demonstrates how to set up and handle common scenarios using ds-express-errors.

Before import ds-express-errors
server.js
1import express from 'express';
2import mongoose from 'mongoose';
3
4const app = express();
5
6mongoose.connect(process.env.DATABASE_URL)
7
8const db = mongoose.connection
9
10db.once("open", () => {
11    console.log("Conected to Database")
12})
13
14app.use(express.json())
15
16import subscribersRouter from './routes/subscribers';
17
18app.use('/subscribers', subscribersRouter)
19
20app.listen(5000, () => {
21    console.log("Server Started")
22})

./models/subscriber.js
1const subscriberSchema = new mongoose.Schema({
2    name: {
3        type: String,
4        unique: true,
5        required: true
6    },
7    subscribedToChannel: {
8        type: String,
9        required: true
10    },
11    subscriberDate: {
12        type: String,
13        required: true,
14        default: Date.now
15    }
16})

./routes/subscribers.js
1import express from 'express';
2const router = express.Router();
3import Subscriber from '../models/subscriber';
4
5//Gettinng all
6router.get('/', async (req, res) => {
7    try {
8        const subscribers = await Subscriber.find()
9        res.json(subscribers)
10    } catch (error) {
11        res.status(500).json({message: error.message})
12    }
13})
14
15//Getting one
16router.get('/name/:name', getSubscriberByName, async (req, res) => {
17    try {
18        if (!res.subscriberByName) {
19            return res.status(404).json({message: "Subscriber not found"})
20        }
21        res.json(res.subscriberByName)
22    } catch (error) {
23        res.status(500).json({message: error.message})
24    }
25})
26
27//Getting one
28router.get('/:id', getSubscriber, (req, res) => {
29    res.json(res.subscriber)
30})
31
32//Creating one
33router.post('/', getSubscriberByName, async (req, res) => {
34    try {
35        if (res.subscriberByName?.name)
36            throw new Error("Name should be unique!");
37
38        if (!req.body.name || !req.body.subscribedToChannel) {
39            return res.status(400).json({message: "Missing required fields"})
40        }
41
42        const subscriber = new Subscriber({
43            name: req.body.name,
44            subscribedToChannel: req.body.subscribedToChannel
45        })
46
47        
48        const newSubscriber = await subscriber.save()
49        res.status(201).json(newSubscriber)
50
51    } catch (error) {
52        res.status(400).json({message: error.message})
53    }
54})
55
56//Updating one
57router.patch('/:id', getSubscriber, async (req, res) => {
58
59    if (!req.body.name && !req.body.subscribedToChannel) {
60        return res.status(400).json({message: "No fields to update"})
61    }
62
63
64    if (req.body.name != null) { 
65        res.subscriber.name = req.body.name 
66    } 
67    if (req.body.subscribedToChannel != null) { 
68        res.subscriber.subscribedToChannel = req.body.subscribedToChannel 
69    }
70    
71
72    try { 
73        const updatedSubscriber = await res.subscriber.save();
74        res.json(updatedSubscriber)
75    } catch (error) {
76        res.status(400).json({message: error.message})
77    }
78
79})
80
81//Deleting one
82router.delete('/:id', getSubscriber, async (req, res) => {
83    try {
84        await res.subscriber.deleteOne()
85        res.status(200).json({message: "Deleted Subscriber"})
86    } catch (error) {
87        res.status(500).json({ message: error.message })
88    }
89})
90
91async function getSubscriber(req, res, next) {
92    let subscriber;
93    try {
94        subscriber = await Subscriber.findById(req.params.id)
95
96        if (subscriber == null) {
97            return res.status(404).json({message: "Cannot find subscriber"})
98        }
99    } catch (error) {
100        return res.status(500).json({message: error.message})
101    }
102
103    res.subscriber = subscriber
104    next()
105}
106
107async function getSubscriberByName(req, res, next) {
108    try {
109        const name = req.params.name || req.body.name;
110        if (!name) {
111            return next();
112        }
113
114        const subscriber = await Subscriber.findOne({name});
115        res.subscriberByName = subscriber;
116
117    } catch (error) {
118        return res.status(500).json({message: error.message})
119    }
120    next()
121}
122
123//exporting the router


After import ds-express-errors
server.js
1import { errorHandler, setConfig } from 'ds-express-errors';
2import express from 'express';
3import mongoose from 'mongoose';
4
5const app = express();
6
7// My custom configuration
8setConfig({
9    formatError: (err, { req, isDev }) => ({
10        success: false,
11        error: {
12            code: err.statusCode,
13            message: err.message,
14            url: req.originalUrl, 
15            ...(isDev ? { debug_stack: err.stack } : {}) 
16        }
17    })
18})
19
20mongoose.connect(process.env.DATABASE_URL)
21
22const db = mongoose.connection
23
24db.once("open", () => {
25    console.log("Conected to Database")
26})
27
28app.use(express.json())
29
30import subscribersRouter from './routes/subscribers';
31
32app.use('/subscribers', subscribersRouter)
33
34// Error Handler
35app.use(errorHandler)
36
37app.listen(5000, () => {
38    console.log("Server Started")
39})

./routes/subscribers.js
1import express from 'express';
2const router = express.Router();
3import Subscriber from '../models/subscriber';
4import { asyncHandler, Errors } from 'ds-express-errors';
5
6const getSubscriber = asyncHandler(async (req, res, next) => {
7    let subscriber;
8    subscriber = await Subscriber.findById(req.params.id)
9
10    if (subscriber == null) {
11        throw Errors.NotFound("Cannot find subscriber");
12    }
13    
14    res.subscriber = subscriber;
15    next();
16});
17
18const getSubscriberByName = asyncHandler(async (req, res, next) => {
19    const name = req.params.name || req.body.name;
20    if (!name) {
21        return next();
22    }
23
24    const subscriber = await Subscriber.findOne({ name });
25    res.subscriberByName = subscriber;
26    next();
27});
28
29//Gettinng all
30router.get('/', asyncHandler( async (req, res) => {
31    const subscribers = await Subscriber.find()
32    res.json(subscribers)
33}))
34
35//Getting one
36router.get('/name/:name', getSubscriberByName, asyncHandler(async (req, res) => {
37    if (!res.subscriberByName) {
38        throw Errors.NotFound("Subscriber not found");
39    }
40    res.json(res.subscriberByName)
41}))
42
43//Getting one
44router.get('/:id', getSubscriber, (req, res) => {
45    res.json(res.subscriber)
46})
47
48//Creating one
49router.post('/', getSubscriberByName, asyncHandler(async (req, res) => {
50    const subscriber = new Subscriber({
51        name: req.body.name,
52        subscribedToChannel: req.body.subscribedToChannel
53    })
54
55    const newSubscriber = await subscriber.save()
56    res.status(201).json(newSubscriber)
57}))
58
59//Updating one
60router.patch('/:id', getSubscriber, asyncHandler(async (req, res) => {
61
62    if (!req.body.name && !req.body.subscribedToChannel) {
63        throw Errors.BadRequest("No fields to update");
64    }
65
66
67    if (req.body.name != null) { 
68        res.subscriber.name = req.body.name 
69    } 
70    if (req.body.subscribedToChannel != null) { 
71        res.subscriber.subscribedToChannel = req.body.subscribedToChannel 
72    }
73    
74
75    const updatedSubscriber = await res.subscriber.save();
76    res.json(updatedSubscriber)
77
78}))
79
80//Deleting one
81router.delete('/:id', getSubscriber, asyncHandler (async (req, res) => {
82    await res.subscriber.deleteOne()
83    res.status(200).json({message: "Deleted Subscriber"})
84}))
85
86//exporting the router