diff --git a/README.md b/README.md new file mode 100644 index 0000000..51debea --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# Express Boilerplate + +## Set up + +4. `npm install` +5. Rename `example.env` to `.env` and add secrets as needed +6. Edit `package.json` project name + +## Usage + +* `npm run dev` - run with Nodemon +* `npm test` - Mocha default +* `npm test -- --watch` - Mocha in watch mode +* `npm run deploy` - pushes to Heroku master diff --git a/app.js b/app.js deleted file mode 100644 index f604885..0000000 --- a/app.js +++ /dev/null @@ -1,17 +0,0 @@ -require('dotenv').config() -const express = require('express') -const morgan = require('morgan') -const cors = require('cors') -const helmet = require('helmet') - -const app = express() - -const morganOption = (process.env.NODE_ENV === 'production') - ? 'tiny' - : 'common'; - -app.use(morgan(morganOption)) -app.use(cors()) -app.use(helmet()) - -module.exports = app \ No newline at end of file diff --git a/example.env b/example.env new file mode 100644 index 0000000..41b85b0 --- /dev/null +++ b/example.env @@ -0,0 +1,3 @@ +NODE_ENV=development +PORT=8000 +EXAMPLE="example-environmental-variable" diff --git a/package.json b/package.json index f805a53..f8224b9 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,11 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start": "node src/server.js" + "test": "mocha --require test/setup.js", + "dev": "nodemon src/server.js", + "start": "node src/server.js", + "predeploy": "npm audit", + "deploy": "git push heroku master" }, "keywords": [], "author": "", diff --git a/server.js b/server.js deleted file mode 100644 index 5774038..0000000 --- a/server.js +++ /dev/null @@ -1,7 +0,0 @@ -const app = require('./app') - -const PORT = process.env.PORT || 8000 - -app.listen(PORT, () => { - console.log(`Server listening at http://localhost:${PORT}`) -}) \ No newline at end of file diff --git a/src/app.js b/src/app.js new file mode 100644 index 0000000..17cc683 --- /dev/null +++ b/src/app.js @@ -0,0 +1,34 @@ +require('dotenv').config(); +const express = require('express'); +const morgan = require('morgan'); +const cors = require('cors'); +const helmet = require('helmet'); + +const { NODE_ENV } = require('./config'); + +const app = express(); + +const morganOption = (NODE_ENV === 'production') + ? 'tiny' + : 'common'; + +app.use(morgan(morganOption)); +app.use(cors()); +app.use(helmet()); + +app.get('/', (req, res) => { + res.send('Hello, world!'); +}); + +app.use(function errorHandler(error, req, res, next) { + let response; + if (NODE_ENV === 'production') { + response = { error: { message: 'server error ' }}; + } else { + console.error(error); + response = { message: error.message, error }; + } + res.status(500).json(response); +}); + +module.exports = app; \ No newline at end of file diff --git a/src/config.js b/src/config.js new file mode 100644 index 0000000..70e820f --- /dev/null +++ b/src/config.js @@ -0,0 +1,4 @@ +module.exports = { + PORT: process.env.PORT || 8000, + NODE_ENV: process.env.NODE_ENV || 'development', +}; diff --git a/src/server.js b/src/server.js new file mode 100644 index 0000000..780dd40 --- /dev/null +++ b/src/server.js @@ -0,0 +1,6 @@ +const app = require('./app'); +const { PORT } = require('./config'); + +app.listen(PORT, () => { + console.log(`Server listening at http://localhost:${PORT}`); +}); diff --git a/test/app.spec.js b/test/app.spec.js new file mode 100644 index 0000000..88e6b21 --- /dev/null +++ b/test/app.spec.js @@ -0,0 +1,9 @@ +const app = require('../src/app'); + +describe('App', () => { + it('GET / responds with 200 containing "Hello, world!"', () => { + return supertest(app) + .get('/') + .expect(200, 'Hello, world!'); + }); +}); diff --git a/test/setup.js b/test/setup.js new file mode 100644 index 0000000..dcb00b3 --- /dev/null +++ b/test/setup.js @@ -0,0 +1,5 @@ +const { expect } = require('chai'); +const supertest = require('supertest'); + +global.expect = expect; +global.supertest = supertest; \ No newline at end of file