https://github.com/rwillians/express-rescue
Sugar code layer for async middlewares and error handers, rewarding you with cleaner and more readable code.
https://github.com/rwillians/express-rescue
error-handling expressjs first-good-issue hacktoberfest javascript nodejs package unhandled-rejection
Last synced: 22 days ago
JSON representation
Sugar code layer for async middlewares and error handers, rewarding you with cleaner and more readable code.
- Host: GitHub
- URL: https://github.com/rwillians/express-rescue
- Owner: rwillians
- License: mit
- Created: 2017-07-01T01:24:44.000Z (almost 8 years ago)
- Default Branch: main
- Last Pushed: 2023-01-09T02:39:06.000Z (over 2 years ago)
- Last Synced: 2025-04-17T15:51:51.680Z (about 1 month ago)
- Topics: error-handling, expressjs, first-good-issue, hacktoberfest, javascript, nodejs, package, unhandled-rejection
- Language: JavaScript
- Homepage:
- Size: 535 KB
- Stars: 17
- Watchers: 1
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://standardjs.com)
[](https://coveralls.io/github/rwillians/express-rescue?branch=main)
[](https://github.com/rwillians/express-rescue/actions/workflows/ci_pr.yml)

# Express Rescue
This is a dependency-free wrapper (or sugar code layer if you will) for async middlewares which makes sure all async errors are passed to your stack of error handlers, allowing you to have a **cleaner and more readable code**.
> **Note**
> Even though this library is supposed to work on `node >= 7.6`, we are unable to test against node versions `7`, `8` and `9` because our tooling requires at least node version `10`. We'll keep the minimum requirement for this library at version `node >= 7.6` so that we allow old projects to keep getting updates, but be aware that we are unable to test againt the mentioned versions.## How to use it
It's really simple:
```js
const rescue = require('express-rescue')/**
* `rescue` insures thrown errors are passed to `next` callback.
*/
app.get('/:id', rescue(async (req, res, next) => {
const user = await repository.getById(req.params.id)if (!user) {
throw new UserNotFoundError
}res.status(200)
.json(user)
}))/**
* `rescue.from` allows you to handle a specific error which is helpful for
* handling domain errors.
*/
app.use(rescue.from(UserNotFoundError, (err, req, res, next) => {
res.status(404)
.json({ error: 'these are not the droids you\'re looking for'})
})/**
* Your error handlers still works as expected. If an error doesn't match your
* `rescue.from` criteria, it will find its way to the next error handler.
*/
app.use((err, req, res, next) => {
res.status(500)
.json({ error: 'i have a bad feeling about this'})
})```
There's a helper function `rescue.all([...])` in case you want to wrap several functions with `rescue`. With `rescue.all`, doing `[rescue(fn1), rescue(fn2)]` can be shortened to `rescue.all([fn1, fn2])`.
```js
const rescue = require('express-rescue')// Doing it like this
app.post('/products', rescue.all([
validationFn,
createProductFn
]))// Is equivalent to this
app.post('/products', [
rescue(validationFn),
rescue(createProductFn)
])
```That's all.
**Hope you enjoy the async/await heaven!**
Chears!
## Tests
```txt
> [email protected] test
> mocha test/*.test.js --check-leaks --full-trace --use_strict --recursiveconst callable = rescue(async ([err,] req, res, next) => { })
calls the last argument (next) with the thrown error
✔ All arguments are been passed to the callback
✔ Raises a TypeError if last argument is not a function
✔ callable(req, res, next) - works for routes and middlewares
✔ callable(err, req, res, next) - works for error handler middlewares
✔ callable(foo, bar, baz, foobar, foobaz, errorHandler) - should work for
basically anything, as long as your function takes an error handler as
the last parameterrescue.from(MyError, (err) => { })
✔ handles the error when error is instance of given constructor
✔ it call `next` function if error is not an instance of given constructorconst callables = rescue.all([fn1, fn2, fn3])
✔ All given functions are wrapped with rescue8 passing (8ms)
```