UNPKG

nodejs-restful-jsonapi-seed

Version:

Everything you need to start building a scalable web application.

155 lines (126 loc) 3.57 kB
'use strict'; import bodyParser from 'body-parser'; import config from 'config'; import cors from 'cors'; import express from 'express'; import fileUpload from 'express-fileupload'; import session from 'express-session'; import logger from 'morgan'; import uuid from 'uuid/v4'; // Local modules. import Database from '~/lib/Database.js'; import SessionStore from '~/lib/SessionStore.js'; import indexRouter from '~/routes/index.js'; // Swagger examples. import swaggerUi from 'swagger-ui-express'; import swaggerJson from '~/../swagger.json'; // Init Express. const app = express(); app.server = createServer(app); // Server options. app.use(bodyParser.json({ limit: config.get('server.parser.bodyLimit'), type: 'application/vnd.api+json' })); app.use(cors({ credentials: config.get('cors.credentials'), methods: config.get('cors.methods'), origin: config.get('cors.origin'), optionsSuccessStatus: 200 })); app.use(fileUpload({ limits: { abortOnLimit: config.get('server.uploads.abortOnLimit'), fileSize: config.get('server.uploads.fileLimit'), safeFileNames: config.get('server.uploads.safeFileNames') } })); app.use(session({ genid: () => uuid(), name: config.get('session.name'), secret: config.get('session.secret'), resave: config.get('session.resave'), cookie: { secure: config.get('session.cookie.secure') }, saveUninitialized: false, store: new SessionStore(session) })); // Enable logging. switch (process.env.NODE_ENV) { case 'production': case 'qa': case 'staging': app.use(logger('combined')); break; case 'test': break; default: app.use(logger('dev')); } // Init database (if available). Database(db => { // Enable routes. app.use(config.get('router.prefix'), indexRouter({config, db})); if (process.env.NODE_ENV === undefined) { app.use('/api-doc/', swaggerUi.serve, swaggerUi.setup(swaggerJson)); app.use('/app-doc/', express.static('doc')); } // Launch server. const serverPort = config.get('server.port'); const serverName = config.get('server.name'); app.server.listen(serverPort, serverName, () => { console.log(`Listening to ${serverName} on port ${serverPort}`); }); // Handle errors. app.server.on('error', err => { switch (err.code) { case 'EACCES': console.error('Port requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error('Port is already in use'); process.exit(1); break; default: throw err; } }); }); /** * Returns a new instance of an HTTP server. * * @param {Function} requestListener * * @return {Function} */ function createServer(requestListener) { const sslConfig = config.get('server.http.ssl.config'); const sslEnable = config.get('server.http.ssl.enable'); const version = config.get('server.http.version'); const protocol = `HTTP/${version}`; if (version === 2 && sslEnable) { console.log(`${protocol} server created`); return require('http2').createSecureServer( sslConfig, requestListener ); } if (version === 1) { if (sslEnable) { console.log(`${protocol} SSL server created`); return require('https').createServer( sslConfig, requestListener ); } else { console.log(`${protocol} server created`); return require('http').createServer( requestListener ); } } } /** * @export default {Express} */ export default app;