Skip to content

Commit e07288d

Browse files
authored
Handle async middleware rejections (#46)
1 parent 83abe5e commit e07288d

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

lib/next.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,17 @@ function next (middlewares, req, res, index, routers, defaultRoute, errorHandler
4848
}
4949

5050
// Call router's lookup method
51-
return middleware.lookup(req, res, step)
51+
const result = middleware.lookup(req, res, step)
52+
return result && typeof result.then === 'function'
53+
? result.catch(err => errorHandler(err, req, res))
54+
: result
5255
}
5356

5457
// Regular middleware function
55-
return middleware(req, res, step)
58+
const result = middleware(req, res, step)
59+
return result && typeof result.then === 'function'
60+
? result.catch(err => errorHandler(err, req, res))
61+
: result
5662
} catch (err) {
5763
return errorHandler(err, req, res)
5864
}

tests/router-coverage.test.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,21 @@ describe('0http - Router Coverage', () => {
366366
expect(res.error).to.equal('Middleware exception')
367367
})
368368

369+
it('should handle async middleware rejections', async () => {
370+
const req = {}
371+
const res = {}
372+
const middleware = async (req, res, next) => {
373+
throw new Error('Async failure')
374+
}
375+
const defaultRoute = () => {}
376+
const errorHandler = (err, req, res) => {
377+
res.error = err.message
378+
}
379+
380+
await next([middleware], req, res, 0, {}, defaultRoute, errorHandler)
381+
expect(res.error).to.equal('Async failure')
382+
})
383+
369384
it('should handle nested router without pattern', () => {
370385
const req = { url: '/test', path: '/test' }
371386
const res = {}

0 commit comments

Comments
 (0)