Skip to content

Commit 1dda415

Browse files
committed
Add final handler
1 parent 7475f53 commit 1dda415

File tree

2 files changed

+32
-35
lines changed

2 files changed

+32
-35
lines changed

src/lambda-wrapper.js

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,40 @@ const { Request } = require('./request');
55
* API Gateway handler generator for Lambda
66
*
77
* @param {object} router Express compatible router instance
8+
* @param {function} finalHandler Process response before sending it. Function params: err, out, req, res
89
* @return {function} Lambda handler for API gateway events
910
* @public
1011
*/
1112

12-
exports.ApiGatewayHandler = (router) => {
13-
// TODO: check router param
13+
exports.ApiGatewayHandler = (router, finalHandler) => {
1414
/**
1515
* Lambda Handler for API Gateway invocations
1616
*
1717
* @param {object} event API Gateway event object
1818
* @param {object} context API Gateway context object
1919
* @return {promise} Returns undefined if callback param is set. Return a promise if callback param is undefined.
2020
*/
21-
return function handleApiGatewayEvent(event, context) {
21+
return handleApiGatewayEvent = (event, context) => {
2222
return new Promise((resolve, reject) => {
23+
2324
const req = new Request(event);
24-
const res = new Response(req, resolve);
25-
req.res = res;
25+
const res = req.res = new Response(req, out => {
26+
resolve(finalHandler(null, out, req, res))
27+
});
28+
2629
// run middleware managed by router
27-
router(req, res, err => {
30+
router(req, res, async err => {
2831
if (err) {
29-
// unexpected errors
30-
reject(err);
32+
// unexpected errors should be handled by final handler
33+
resolve(finalHandler(err, null, req, res))
3134
} else if (res.writableEnded) {
32-
console.error('ERROR: next() should not be used after res.send() within routing middleware')
35+
console.error('ERROR: next() should not be used after res.send() within routing middleware');
3336
} else {
3437
// expected error
3538
res.status(404).send('Not found');
3639
}
3740
})
41+
3842
})
3943
}
40-
}
44+
}

src/lambda-wrapper.spec.js

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ const { ApiGatewayHandler } = require('./lambda-wrapper');
22
const Router = require('router');
33
const bodyParser = require('body-parser');
44

5+
function finalHandlerPassTrough (err, out, req, res) {
6+
return out
7+
}
8+
59
describe('Lambda Wrapper', () => {
610
const proxyRequest = {
711
body: null,
@@ -24,7 +28,7 @@ describe('Lambda Wrapper', () => {
2428
router.use((req, res) => {
2529
res.json({a: 1});
2630
})
27-
const lambdaHandler = ApiGatewayHandler(router);
31+
const lambdaHandler = ApiGatewayHandler(router, finalHandlerPassTrough);
2832
const proxyRequest = {
2933
body: '',
3034
headers: {},
@@ -59,7 +63,7 @@ describe('Lambda Wrapper', () => {
5963
router.use((req, res) => {
6064
res.json(req.body);
6165
})
62-
const lambdaHandler = ApiGatewayHandler(router);
66+
const lambdaHandler = ApiGatewayHandler(router, finalHandlerPassTrough);
6367

6468
const requestObject = JSON.stringify({a: 1});
6569
const proxyRequest = {
@@ -104,7 +108,7 @@ describe('Lambda Wrapper', () => {
104108
router.use((req, res) => {
105109
res.json({b: req.fromFirstEndpoint});
106110
})
107-
const lambdaHandler = ApiGatewayHandler(router);
111+
const lambdaHandler = ApiGatewayHandler(router, finalHandlerPassTrough);
108112

109113
const result = await lambdaHandler(proxyRequest, {});
110114

@@ -118,43 +122,32 @@ describe('Lambda Wrapper', () => {
118122
});
119123

120124
it('should handle errors', async () => {
121-
expect.assertions(2);
125+
expect.assertions(1);
122126

123127
const router = Router()
124128
router.use((req, res, next) => {
125129
throw Error('test');
126130
})
127-
const lambdaHandler = ApiGatewayHandler(router);
128-
129-
try{
130-
await lambdaHandler(proxyRequest, {})
131-
} catch (err) {
132-
expect(err).toEqual(Error('test'));
133-
}
134131

135-
await lambdaHandler(proxyRequest, {}).catch(err => {
132+
const lambdaHandler2 = ApiGatewayHandler(router, err => {
133+
console.log('OK2')
136134
expect(err).toEqual(Error('test'));
137135
})
136+
await lambdaHandler2(proxyRequest, {})
138137
})
139138

140139
it('should handle next(error)', async () => {
141-
expect.assertions(2);
140+
expect.assertions(1);
142141

143142
const router = Router()
144143
router.use((req, res, next) => {
145144
next('test');
146145
})
147-
const lambdaHandler = ApiGatewayHandler(router);
148-
149-
try{
150-
await lambdaHandler(proxyRequest, {})
151-
} catch (err) {
146+
const lambdaHandler = ApiGatewayHandler(router, err => {
152147
expect(err).toEqual('test');
153-
}
148+
});
149+
await lambdaHandler(proxyRequest, {})
154150

155-
await lambdaHandler(proxyRequest, {}).catch(err => {
156-
expect(err).toEqual('test');
157-
})
158151
})
159152

160153
it('GET with path', async () => {
@@ -168,7 +161,7 @@ describe('Lambda Wrapper', () => {
168161
res.json({a: req.fromFirstEndpoint, b: 2});
169162
});
170163

171-
const lambdaHandler = ApiGatewayHandler(router);
164+
const lambdaHandler = ApiGatewayHandler(router, finalHandlerPassTrough);
172165
const proxyRequest = {
173166
body: '',
174167
headers: {},
@@ -207,7 +200,7 @@ describe('Lambda Wrapper', () => {
207200
res.json({a: req.foo, b: 2});
208201
});
209202

210-
const lambdaHandler = ApiGatewayHandler(router);
203+
const lambdaHandler = ApiGatewayHandler(router, finalHandlerPassTrough);
211204

212205
const result = await lambdaHandler(proxyRequest, {});
213206
expect(result).toEqual({
@@ -231,7 +224,7 @@ describe('Lambda Wrapper', () => {
231224
const router = Router()
232225
router.use('/testing', subRouter)
233226

234-
const lambdaHandler = ApiGatewayHandler(router);
227+
const lambdaHandler = ApiGatewayHandler(router, finalHandlerPassTrough);
235228

236229
let request = {}
237230
Object.assign(request, proxyRequest)

0 commit comments

Comments
 (0)