Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
30 changes: 30 additions & 0 deletions gulpfile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const gulp = require('gulp');
const eslint = require('gulp-eslint');
const mocha = require('gulp-mocha');
const watch = require('gulp-watch');

gulp.task('lint', () => {
gulp.src(['./*.js', './test/*.js'])
.pipe(eslint({
env: [
'mocha',
'es6'
]
}))
.pipe(eslint.format());
});

gulp.task('mocha', () => {
return gulp.src('./test/*.js', {
read: false
})
.pipe(mocha({
reporter: 'nyan'
}));
});

gulp.task('watch', () => {
gulp.watch(['./*.js', './test/*.js' ], ['mocha', 'lint']);
});

gulp.task('default', ['mocha', 'lint', 'watch']);
20 changes: 20 additions & 0 deletions lib/jsonModelParser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
'use strict';

module.exports = (req, res, next) => {
var incJson = '';
req.on('data', (data) => {
incJson += data.toString();
});
req.on('end', () => {
try {
var parsed = JSON.parse(incJson);
req.body = parsed;

} catch(e) {
e.message = 'invalid json';
e.statusCode = 422;
return next(e);
}
next();
});
}
36 changes: 36 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"name": "drew_express_middleware",
"version": "1.0.0",
"description": "##To Submit this Assignment * fork this repository * write all of your code in a folder containing your name * push to your repository * submit a pull request to this repository * submit a link to your PR in canvas",
"main": "gulpfile.js",
"directories": {
"test": "test"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/drewferris/express_middleware.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/drewferris/express_middleware/issues"
},
"homepage": "https://github.com/drewferris/express_middleware#readme",
"devDependencies": {
"chai": "^3.5.0",
"chai-http": "^2.0.1",
"gulp": "^3.9.1",
"gulp-eslint": "^2.0.0",
"gulp-mocha": "^2.2.0",
"gulp-watch": "^4.3.5",
"mocha": "^2.4.5",
"mock-req": "^0.2.0"
},
"dependencies": {
"body-parser": "^1.15.1",
"express": "^4.13.4"
}
}
60 changes: 60 additions & 0 deletions server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
'use strict';

const express = require('express');
const app = express();
const jsonModelParser = require('./lib/jsonModelParser');

var routerGetData = new express.Router();
var routerSetData = new express.Router();
var fileRouter = new express.Router();

const model = {
data: {
msg: 'hello ther'
},

nodata: {
msg: 'No model'
}
};

app.use((req, res, next) => {
req.model = model;
next();
});

routerSetData.use(jsonModelParser);

routerGetData.get('/', (req, res) => {
res.type('json');
if (req.model.data) {
res.send(req.model.data);
} else {
res.send(req.model.nodata);
}
});

routerSetData.post('/', (req, res) => {
res.type('json');
res.json({
msg: 'valid data',
data: req.body
});
});

app.use('/drew', routerGetData);
app.use('/drew', routerSetData);
app.use((err, req, res, next) => {
console.log(err);
res.status(err.statusCode || 500).json({
msg: err.message
});
});

app.use((req, res) => {
res.status(404).json({
msg: 'page not found'
});
});

app.listen(3000, () => console.log('server up on 3000'));
58 changes: 58 additions & 0 deletions test/middleware_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
'use strict';

const chai = require('chai');
const chaiHTTP = require('chai-http');
const expect = chai.expect;
chai.use(chaiHTTP);
const request = chai.request;
const jsonModelParser = require('../lib/jsonModelParser');
var MockReq = require('mock-req');
require('../server');

describe('jsonModelParser tests', () => {
it('should receive a get request', (done) => {
request('localhost:3000')
.get('/drew')
.end((err, res) => {
expect(err).to.eql(null);
expect(res.body.msg).to.eql('hello ther');
expect(res).to.have.status(200);
done();
});
});

it('should receive a post request', (done) => {
request('localhost:3000')
.post('/drew')
.send('{"test": "test"}')
.end((err, res) => {
expect(err).to.eql(null);
expect(res.body.msg).to.eql('valid data');
expect(res).to.have.status(200);
done();
});
});

it('should error for bad path', (done) => {
request('localhost:3000')
.get('/')
.end((err, res) => {
expect(err).to.not.eql(null);
expect(res).to.have.status(404);
expect(res.body.msg).to.eql('page not found');
done();
});
});

it('should error for invalid JSON', (done) => {
request('localhost:3000')
.post('/drew')
.send('booger')
.end((err, res) => {
expect(err).to.not.eql(null);
expect(res).to.have.status(422);
expect(res.body.msg).to.eql('invalid json');
done();
});
});
});
50 changes: 50 additions & 0 deletions test/middleware_test2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
'use strict';
const jsonModelParser = require('../lib/jsonModelParser');
var MockReq = require('mock-req');
const chai = require('chai');
const chaiHTTP = require('chai-http');
const expect = chai.expect;
var res = {};

describe('tests for jsonModelParser', () => {
it('should parse JSON', (done) => {

var req = new MockReq({
method: 'POST',
url: '/'
});

let data = {will:'work'};
req.write(data);
req.end();
jsonModelParser(req, res, function(e) {
if(e) {
done(e);
} else {
expect(req.body).to.eql(data);
done();
}
});
});

it('error on non JSON', (done) => {

var req = new MockReq({
method: 'POST',
url: '/'
});

let data = ('work');
req.write(data);
req.end();
jsonModelParser(req, res, function(e) {
if(e) {
expect(e.message).to.eql('invalid json');
expect(e.statusCode).to.eql(422);
done();
} else {
done(new Error('JSON worked'));
}
});
});
});