/** * 应用程序入口。 */ "use strict"; let express = require('express'); let path = require('path'); let favicon = require('serve-favicon'); let logger = require('morgan'); let cookieParser = require('cookie-parser'); let bodyParser = require('body-parser'); let log = require('./util/log'); let redis = require('redis'); let methodOverride = require('method-override'); // server configurations let configFile = require('./include/commons').CONFIG_FILE; let config = require('./resources/config/' + configFile); // handlers let SocketHandler = require('./handlers/socket.handler'); let UrlInitializer = require('./endpoints/url.initializer'); let JobInitializer = require('./models/schedule/job.initializer'); //消息订阅 let pubSub = require('./models/redis/pubSub.js'); // initialize express application let app = express(); app.set('port', config.serverPort); // view engine app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // logger, body parser, cookie parser and view path app.use(favicon(__dirname + '/public/favicon.ico', null)); app.use(logger('dev')); app.use(bodyParser.json({limit:'50mb'})); app.use(bodyParser.urlencoded({limit:'50mb',extended: true})); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use(methodOverride(null, {methods: ['GET', 'POST', 'PUT', 'DELETE']})); //禁止options请求 app.options('*', (req, res) => { res.status(406) .send({message: "禁止options"}); }); // web pages and endpoint UrlInitializer.initWebPages(app); UrlInitializer.initRestApi(app); // error handler, only handle the sync call exception app.use(function (err, req, res, next) { if (err) { res.status(err.httpStatus || 500) .send({message: err.message}); } next(err); }); // In development mode, error handler will print stacktrace, only handle the sync call exception if (app.get('env') === 'development') { app.use(function (err, req, res, next) { log.error(err); next(err); }); } // only handle the sync call exception process.on('uncaughtException', function (err) { console.error(err); }); // now enable http server and socket.io let server; // https if(config.httpsOpen){ let fs = require("fs"); // Configuare https let httpsOption = { key : fs.readFileSync(config.httpsConfig.key), cert: fs.readFileSync(config.httpsConfig.pem) } server = require('https').createServer(app); }else{ server = require('http').createServer(app); } let io = require('socket.io').listen(server); // let io = require('socket.io').listen(server,{path:"/mlw/im"}); //im子目录 nginx也需要修改 server.listen(config.serverPort); // event listener for HTTP server "error" event server.on('error', function (error) { if (error.syscall !== 'listen') throw error; let bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; } }); // event listener for HTTP server "listening" event server.on('listening', function onListening() { let addr = server.address(); let bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; log.info('bind'+bind); }); let socketHandler = new SocketHandler(io); socketHandler.start(); if(!server.address()){ log.error('Starting IM server failed, port is already in used.'); process.exit(1); } else { log.info('Starting IM server, version ' + config.version + ', running on port ' + server.address().port + ', ' + new Date().toLocaleString()); log.info('Configuration profile: ' + configFile.split('.')[1]); } // JobInitializer.init(); pubSub.registerHandlers(config.subChannel,msg=> console.log(msg)); pubSub.subscribe(config.subChannel);