Skip to content

Instantly share code, notes, and snippets.

@q42jaap
Created April 6, 2017 14:51
Show Gist options
  • Save q42jaap/f2fb93d96fda6384d3e3fc51977dec90 to your computer and use it in GitHub Desktop.
Save q42jaap/f2fb93d96fda6384d3e3fc51977dec90 to your computer and use it in GitHub Desktop.
A way to allow async await style middleware
import Layer from 'express/lib/router/layer';
const Promise = global.Promise;
/**
* "fixt" express mbt promises. Als een stukje middleware een promise returnt dan moeten errors eigenlijk aan next worden gegeven.
*
* We hadden ook de suffix `Async` kunnen gebruiken om naast de bestaande functies nieuwe te maken. Dat heeft een flink nadeel
* omdat de api op verschillende manieren te benaderen is.
*/
const {handle_request, handle_error} = Layer.prototype;
Layer.prototype.handle_request = function(...args) {
// Dit gebeurt maar 1 keer als de router de route voor het eerst wordt geëvalueerd tegen een request.
this.handle = wrapHandler(this.handle);
this.handle_request = handle_request; // Dit herstelt de functie uit het originele prototype voor het huidige object.
return this.handle_request(...args);
};
Layer.prototype.handle_error = function(...args) {
this.handle = wrapHandler(this.handle);
this.handle_error = handle_error;
return this.handle_error(...args);
};
function wrapHandler(fn) {
if (fn.length > 3) {
return (error, req, res, next) => {
Promise.resolve(fn(error, req, res, next))
.catch(next);
};
} else {
return (req, res, next) => {
Promise.resolve(fn(req, res, next))
.catch(next);
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment