92 lines
2.0 KiB
JavaScript
92 lines
2.0 KiB
JavaScript
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)
|