Skip to content

Commit a70d4d9

Browse files
authored
Merge pull request #9 from jkyberneees/improve-error-handling
Improve error handling
2 parents e86612d + f2e0a82 commit a70d4d9

6 files changed

Lines changed: 53 additions & 18 deletions

File tree

README.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,26 @@ server.listen(3000)
6868
}
6969
```
7070
- **cacheSize**: Router matching LRU cache size. Default value: `1000`
71+
- **errorHandler**: Global error handler function. Default value:
72+
```js
73+
(err, req, res) => {
74+
res.statusCode = 500
75+
res.end(err.message)
76+
}
77+
```
78+
79+
Example passing configuration options:
80+
```js
81+
const sequential = require('0http/lib/router/sequential')
82+
const { router, server } = cero({
83+
router: sequential({
84+
cacheSize: 2000
85+
})
86+
})
87+
```
7188

7289
#### Async middlewares
73-
You can user async middlewares to await the remaining chain execution. Let's describe with a custom error handler middleware:
90+
You can use async middlewares to await the remaining chain execution. Let's describe with a custom error handler middleware:
7491
```js
7592
router.use('/', async (req, res, next) => {
7693
try {

demos/error-handling.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
const sequential = require('../lib/router/sequential')
22
const cero = require('../index')
33

4+
const errorHandler = (err, req, res) => {
5+
res.statusCode = 500
6+
res.end(err.message)
7+
}
48
const { router, server } = cero({
5-
router: sequential()
9+
router: sequential(),
10+
errorHandler
611
})
712

813
router.use('/', async (req, res, next) => {
914
try {
1015
await next()
1116
} catch (err) {
12-
res.statusCode = 500
13-
res.end('Error Handler: ' + err.message)
17+
errorHandler(err, req, res)
1418
}
1519
})
1620

@@ -22,6 +26,12 @@ router.get('/err2', (req, res, next) => {
2226
next(new Error('Uuuups!'))
2327
})
2428

29+
router.get('/err3', async (req, res, next) => {
30+
setTimeout(() => {
31+
next(new Error('Uuuups!'))
32+
}, 50)
33+
})
34+
2535
router.get('/async-err', async (req, res, next) => {
2636
throw new Error('Uuuups!')
2737
})

lib/next.js

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
function next (middlewares, req, res, index, routerPatterns = {}, defaultRoute) {
1+
function next (middlewares, req, res, index, routerPatterns = {}, defaultRoute, errorHandler) {
22
const middleware = middlewares[index]
33
if (!middleware) {
44
if (!res.finished) {
@@ -9,20 +9,24 @@ function next (middlewares, req, res, index, routerPatterns = {}, defaultRoute)
99
}
1010

1111
function step (err) {
12-
if (err) throw err
13-
return next(middlewares, req, res, ++index, routerPatterns, defaultRoute)
12+
if (err) errorHandler(err, req, res)
13+
return next(middlewares, req, res, ++index, routerPatterns, defaultRoute, errorHandler)
1414
}
1515

16-
if (middleware.id) {
16+
try {
17+
if (middleware.id) {
1718
// nested routes support
18-
const pattern = routerPatterns[middleware.id]
19-
if (pattern) {
20-
req.preRouterUrl = req.url
21-
req.url = req.url.replace(pattern, '')
19+
const pattern = routerPatterns[middleware.id]
20+
if (pattern) {
21+
req.preRouterUrl = req.url
22+
req.url = req.url.replace(pattern, '')
23+
}
24+
middleware.lookup(req, res, step)
25+
} else {
26+
return middleware(req, res, step)
2227
}
23-
middleware.lookup(req, res, step)
24-
} else {
25-
return middleware(req, res, step)
28+
} catch (err) {
29+
errorHandler(err, req, res)
2630
}
2731
}
2832

lib/router/sequential.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ module.exports = (config = {}) => {
77
res.statusCode = 404
88
res.end()
99
})
10+
config.errorHandler = config.errorHandler || ((err, req, res) => {
11+
res.statusCode = 500
12+
res.end(err.message)
13+
})
1014
config.cacheSize = config.cacheSize || 1000
1115
config.id = config.id || (Date.now().toString(36) + Math.random().toString(36).substr(2, 5)).toUpperCase()
1216

@@ -63,7 +67,7 @@ module.exports = (config = {}) => {
6367

6468
// middlewares invocation
6569
req.params = Object.assign(req.params || {}, match.params)
66-
next(middlewares, req, res, 0, routersPattern, config.defaultRoute)
70+
next(middlewares, req, res, 0, routersPattern, config.defaultRoute, config.errorHandler)
6771
} else {
6872
config.defaultRoute(req, res)
6973
}

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "0http",
3-
"version": "2.1.0",
3+
"version": "2.2.0",
44
"description": "Cero friction HTTP request router. The need for speed!",
55
"main": "index.js",
66
"scripts": {

0 commit comments

Comments
 (0)