Created
April 6, 2017 14:51
-
-
Save q42jaap/f2fb93d96fda6384d3e3fc51977dec90 to your computer and use it in GitHub Desktop.
A way to allow async await style middleware
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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