const dotenv = require('dotenv') const compression = require('compression') const express = require('express') const morgan = require('morgan') const bodyParser = require('body-parser') const path = require('path') const rfs = require('rotating-file-stream') const cors = require('cors') const errorhandler = require('errorhandler') const statusCodes = require('http-status-codes').StatusCodes const createError = require('http-errors') const apiRouter = require('./routes') // load .env config file dotenv.config() // main app file const app = express() // create a rotating write stream const accessLogStream = rfs.createStream('access.log', { interval: '1d', // rotate daily path: path.join(__dirname, 'log') }) // setup the file logger app.use(morgan('common', { stream: accessLogStream })) // setup the console logger if (process.env.NODE_ENV === 'development') { // [debug] app.use(morgan('dev')) } else { // [production] app.use(morgan('dev', { skip: function (req, res) { return res.statusCode < 400 } })) } // be proxy aware app.enable('trust proxy') // cross-origin resource sharing app.use(cors()) // json middleware app.use(bodyParser.json()) // healthcheck (can be used for heart-beat) app.get('/status', (req, res) => { res.status(200).end() }); app.head('/status', (req, res) => { res.status(200).end() }); // routes app.use('/api', apiRouter) // 404 middleware app.use((req, res, next) => { next(createError(statusCodes.NOT_FOUND)) }) // error handling app.use((err, req, res, next) => { /* Handle 401 */ if (err.status === statusCodes.UNAUTHORIZED) { return res .status(err.status) .send({ message: err.message }) .end() } return next(err) }) if (process.env.NODE_ENV !== 'development') { app.use((err, req, res, next) => { res.status(err.status || 500) res.json({ errors: { message: err.message, }, }) }) } // start the server app.listen(process.env.PORT, process.env.HOST) console.log('service started on port ' process.env.HOST + ':' + process.env.PORT)