Skip to content

Commit d87696c

Browse files
authored
Merge pull request #11 from eXigentCoder/master
Test + code to copy properties from the old function to wrapped function
2 parents 6a5e7bc + 8647078 commit d87696c

File tree

2 files changed

+59
-4
lines changed

2 files changed

+59
-4
lines changed

index.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
const Layer = require('express/lib/router/layer');
22

3+
function copyOldProps(oldFn, newFn) {
4+
Object.keys(oldFn).forEach((key) => {
5+
newFn[key] = oldFn[key];
6+
});
7+
return newFn;
8+
}
9+
310
function wrapErrorMiddleware(fn) {
4-
return (err, req, res, next) => {
11+
const newFn = (err, req, res, next) => {
512
const ret = fn.call(this, err, req, res, next);
613

714
if (ret && ret.catch) {
@@ -10,10 +17,11 @@ function wrapErrorMiddleware(fn) {
1017

1118
return ret;
1219
};
20+
return copyOldProps(fn, newFn);
1321
}
1422

1523
function wrap(fn) {
16-
return (req, res, next) => {
24+
const newFn = (req, res, next) => {
1725
const ret = fn.call(this, req, res, next);
1826

1927
if (ret && ret.catch) {
@@ -24,11 +32,14 @@ function wrap(fn) {
2432

2533
return ret;
2634
};
35+
return copyOldProps(fn, newFn);
2736
}
2837

2938
Object.defineProperty(Layer.prototype, 'handle', {
3039
enumerable: true,
31-
get() { return this.__handle; },
40+
get() {
41+
return this.__handle;
42+
},
3243
set(fn) {
3344
// Bizarre, but Express checks for 4 args to detect error middleware: https://github.com/expressjs/express/blob/master/lib/router/layer.js
3445
if (fn.length === 4) {

test.js

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require('./index.js');
22
const express = require('express');
33
const supertest = require('supertest');
4+
const assert = require('assert');
45

56
describe('express-async-errors', () => {
67
it('propagates routes errors to error handler', () => {
@@ -31,7 +32,6 @@ describe('express-async-errors', () => {
3132
throw new Error('error');
3233
});
3334

34-
3535
app.use((err, req, res, next) => {
3636
res.status(495);
3737
res.end();
@@ -62,4 +62,48 @@ describe('express-async-errors', () => {
6262
.get('/test')
6363
.expect(495);
6464
});
65+
66+
it('should preserve the router stack for external routes', () => {
67+
const app = express();
68+
69+
function swaggerize(item) {
70+
function describeRouterRoute(router, metaData) {
71+
const lastRoute = router.stack[router.stack.length - 1];
72+
const verb = Object.keys(lastRoute.route.methods)[0];
73+
metaData.path = lastRoute.route.path;
74+
metaData.verb = verb;
75+
lastRoute.route.swaggerData = metaData;
76+
metaData.described = true;
77+
}
78+
79+
function describe(metaData) {
80+
if (item.stack) {
81+
describeRouterRoute(item, metaData);
82+
return item;
83+
}
84+
describeRouterRoute(item._router, metaData);
85+
return item;
86+
}
87+
88+
item.describe = describe;
89+
}
90+
91+
const router = express.Router();
92+
swaggerize(router);
93+
94+
router
95+
.get('/test', (req, res) => {
96+
res.status(200).send('Ok');
97+
})
98+
.describe({ hasDescription: true });
99+
app.use('/', router);
100+
101+
const appRouteStack = app._router.stack;
102+
const someMiddlewareFunctionStack = appRouteStack[appRouteStack.length - 1];
103+
const innerStack = someMiddlewareFunctionStack.handle.stack;
104+
const routeData = innerStack[0].route.swaggerData;
105+
assert.ok(routeData);
106+
assert.equal(routeData.verb, 'get');
107+
assert.equal(routeData.hasDescription, true);
108+
});
65109
});

0 commit comments

Comments
 (0)