Unexpected behavior handling async route handlers and Express Error middleware
bunchito opened this issue · 3 comments
I'm trying this package but I cannot make it work with the "Express Error Middleware".
src/routes/users.js
// ... code
router.get('/', async function (req, res) {
throw new Error('Broken');
});
// ... code
src/index.js
// ... code
require('express-async-errors');
const users = require('./routes/users');
app.use('/users', users);
// Last middleware
app.use(function(err, req, res, next){
console.error( err.stack);
res.status(500).send('Something broke!');
next(err);
});
// ... code
When I make a GET request to http://127.0.0.1:3333/users I see:
In the console
throw new Error('BROKEN')
^
Error: BROKEN
The application crushes and process exits.
There is not hitting the express error middleware and there is no 500 response.
If I create my own async handler and wrap the user route, the express error middleware works:
src/routes/users.js
// ... code
function asyncError(handler) {
return async (req, res, next) => {
try {
await handler(req, res);
} catch (err) {
next(err);
}
}
}
router.get('/', asyncError(async function (req, res) {
throw new Error('Broken');
}));
// ... code
When I make a GET request to http://127.0.0.1:3333/users I see:
In the console
Error: BROKEN
And I receive a 500
response with the text Something broke!
How can I achieve this behavior with this library? Thanks!
Whats the order of your imports/requires?
Thanks, @kronicker
Your comment helped me to resolve the issue. It was the last (bottom). I moved it first (top) and now everything works as expected.
No problem. Since it's patching express it should be required right after express
.