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 routerAfter 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