Skip to content

Commit

Permalink
close #50 by adding support for multiple middlewares
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremydaly committed Aug 12, 2018
1 parent 09abe13 commit a2259a2
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 7 deletions.
20 changes: 13 additions & 7 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -248,16 +248,22 @@ class API {
// Middleware handler
use(path,handler) {

let fn = typeof path === 'function' ? path : handler
// Extract routes
let routes = typeof path === 'string' ? Array.of(path) : (Array.isArray(path) ? path : [])

if (fn.length === 3) {
this._middleware.push([routes,fn])
} else if (fn.length === 4) {
this._errors.push(fn)
} else {
throw new Error('Middleware must have 3 or 4 parameters')
// Add func args as middleware
for (let arg in arguments) {
if (typeof arguments[arg] === 'function') {
if (arguments[arg].length === 3) {
this._middleware.push([routes,arguments[arg]])
} else if (arguments[arg].length === 4) {
this._errors.push(arguments[arg])
} else {
throw new Error('Middleware must have 3 or 4 parameters')
}
}
}

} // end use


Expand Down
31 changes: 31 additions & 0 deletions test/errorHandling.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ const expect = require('chai').expect // Assertion library

// Init API instance
const api = require('../index')({ version: 'v1.0' })
const api2 = require('../index')({ version: 'v1.0' })

// NOTE: Set test to true
api._test = true;
api2._test = true;

let event = {
httpMethod: 'get',
Expand Down Expand Up @@ -58,6 +60,22 @@ api.use(function(err,req,res,next) {
}
});

const errorMiddleware1 = (err,req,res,next) => {
req.errorMiddleware1 = true
next()
}

const errorMiddleware2 = (err,req,res,next) => {
req.errorMiddleware2 = true
next()
}

const sendError = (err,req,res,next) => {
res.type('text/plain').send('This is a test error message: ' + req.errorMiddleware1 + '/' + req.errorMiddleware2)
}

api2.use(errorMiddleware1,errorMiddleware2,sendError)

/******************************************************************************/
/*** DEFINE TEST ROUTES ***/
/******************************************************************************/
Expand Down Expand Up @@ -86,6 +104,12 @@ api.get('/testErrorPromise', function(req,res) {
res.error('This is a test error message')
})


api2.get('/testError', function(req,res) {
res.status(500)
res.error('This is a test error message')
})

/******************************************************************************/
/*** BEGIN TESTS ***/
/******************************************************************************/
Expand Down Expand Up @@ -124,4 +148,11 @@ describe('Error Handling Tests:', function() {
expect(result).to.deep.equal({ headers: { 'content-type': 'text/plain' }, statusCode: 500, body: 'This is a test error message: 123/456', isBase64Encoded: false })
}) // end it

it('Multiple error middlewares', async function() {
let _event = Object.assign({},event,{ path: '/testError'})
let result = await new Promise(r => api2.run(_event,{},(e,res) => { r(res) }))
expect(result).to.deep.equal({ headers: { 'content-type': 'text/plain' }, statusCode: 500, body: 'This is a test error message: true/true', isBase64Encoded: false })
}) // end it


}) // end ERROR HANDLING tests
78 changes: 78 additions & 0 deletions test/middleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@ const expect = require('chai').expect // Assertion library
const api = require('../index')({ version: 'v1.0' })
const api2 = require('../index')({ version: 'v1.0' })
const api3 = require('../index')({ version: 'v1.0' })
const api4 = require('../index')({ version: 'v1.0' })
const api5= require('../index')({ version: 'v1.0' })

// NOTE: Set test to true
api._test = true;
api2._test = true;
api3._test = true;
api4._test = true;
api5._test = true;

let event = {
httpMethod: 'get',
Expand Down Expand Up @@ -84,6 +88,20 @@ api3.use(['/test','/test/:param1','/test2/*'],function(req,res,next) {
next()
})

const middleware1 = (req,res,next) => {
req.middleware1 = true
next()
}

const middleware2 = (req,res,next) => {
req.middleware2 = true
next()
}

api4.use(middleware1,middleware2);
api5.use('/test/x',middleware1,middleware2);
api5.use('/test/y',middleware1);

/******************************************************************************/
/*** DEFINE TEST ROUTES ***/
/******************************************************************************/
Expand Down Expand Up @@ -134,6 +152,38 @@ api3.get('/test3', function(req,res) {
res.status(200).json({ method: 'get', middleware: req.testMiddlewareAll ? true : false })
})

api4.get('/test', (req,res) => {
res.status(200).json({
method: 'get',
middleware1: req.middleware1 ? true : false,
middleware2: req.middleware2 ? true : false
})
})

api5.get('/test', (req,res) => {
res.status(200).json({
method: 'get',
middleware1: req.middleware1 ? true : false,
middleware2: req.middleware2 ? true : false
})
})

api5.get('/test/x', (req,res) => {
res.status(200).json({
method: 'get',
middleware1: req.middleware1 ? true : false,
middleware2: req.middleware2 ? true : false
})
})

api5.get('/test/y', (req,res) => {
res.status(200).json({
method: 'get',
middleware1: req.middleware1 ? true : false,
middleware2: req.middleware2 ? true : false
})
})

/******************************************************************************/
/*** BEGIN TESTS ***/
/******************************************************************************/
Expand Down Expand Up @@ -213,4 +263,32 @@ describe('Middleware Tests:', function() {
}) // end it


it('Multiple middlewares (no path)', async function() {
let _event = Object.assign({},event,{ path: '/test' })
let result = await new Promise(r => api4.run(_event,{},(e,res) => { r(res) }))
expect(result).to.deep.equal({ headers: { 'content-type': 'application/json' }, statusCode: 200, body: '{"method":"get","middleware1":true,"middleware2":true}', isBase64Encoded: false })
}) // end it


it('Multiple middlewares (w/o matching path)', async function() {
let _event = Object.assign({},event,{ path: '/test' })
let result = await new Promise(r => api5.run(_event,{},(e,res) => { r(res) }))
expect(result).to.deep.equal({ headers: { 'content-type': 'application/json' }, statusCode: 200, body: '{"method":"get","middleware1":false,"middleware2":false}', isBase64Encoded: false })
}) // end it


it('Multiple middlewares (w/ matching path)', async function() {
let _event = Object.assign({},event,{ path: '/test/x' })
let result = await new Promise(r => api5.run(_event,{},(e,res) => { r(res) }))
expect(result).to.deep.equal({ headers: { 'content-type': 'application/json' }, statusCode: 200, body: '{"method":"get","middleware1":true,"middleware2":true}', isBase64Encoded: false })
}) // end it


it('Single middleware (w/ matching path)', async function() {
let _event = Object.assign({},event,{ path: '/test/y' })
let result = await new Promise(r => api5.run(_event,{},(e,res) => { r(res) }))
expect(result).to.deep.equal({ headers: { 'content-type': 'application/json' }, statusCode: 200, body: '{"method":"get","middleware1":true,"middleware2":false}', isBase64Encoded: false })
}) // end it


}) // end MIDDLEWARE tests

1 comment on commit a2259a2

@jeremydaly
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs to be added to documentation.

Please sign in to comment.