app.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /**
  2. * 应用程序入口。
  3. */
  4. "use strict";
  5. let express = require('express');
  6. let path = require('path');
  7. let favicon = require('serve-favicon');
  8. let logger = require('morgan');
  9. let cookieParser = require('cookie-parser');
  10. let bodyParser = require('body-parser');
  11. let log = require('./util/log');
  12. let redis = require('redis');
  13. let methodOverride = require('method-override');
  14. // server configurations
  15. let configFile = require('./include/commons').CONFIG_FILE;
  16. let config = require('./resources/config/' + configFile);
  17. // handlers
  18. let SocketHandler = require('./handlers/socket.handler');
  19. let UrlInitializer = require('./endpoints/url.initializer');
  20. let JobInitializer = require('./models/schedule/job.initializer');
  21. //消息订阅
  22. let pubSub = require('./models/redis/pubSub.js');
  23. // initialize express application
  24. let app = express();
  25. app.set('port', config.serverPort);
  26. // view engine
  27. app.set('views', path.join(__dirname, 'views'));
  28. app.set('view engine', 'jade');
  29. // logger, body parser, cookie parser and view path
  30. app.use(favicon(__dirname + '/public/favicon.ico', null));
  31. app.use(logger('dev'));
  32. app.use(bodyParser.json({limit:'50mb'}));
  33. app.use(bodyParser.urlencoded({limit:'50mb',extended: true}));
  34. app.use(cookieParser());
  35. app.use(express.static(path.join(__dirname, 'public')));
  36. app.use(methodOverride(null, {methods: ['GET', 'POST', 'PUT', 'DELETE']}));
  37. //禁止options请求
  38. app.options('*', (req, res) => {
  39. res.status(406)
  40. .send({message: "禁止options"});
  41. });
  42. // web pages and endpoint
  43. UrlInitializer.initWebPages(app);
  44. UrlInitializer.initRestApi(app);
  45. // error handler, only handle the sync call exception
  46. app.use(function (err, req, res, next) {
  47. if (err) {
  48. res.status(err.httpStatus || 500)
  49. .send({message: err.message});
  50. }
  51. next(err);
  52. });
  53. // In development mode, error handler will print stacktrace, only handle the sync call exception
  54. if (app.get('env') === 'development') {
  55. app.use(function (err, req, res, next) {
  56. log.error(err);
  57. next(err);
  58. });
  59. }
  60. // only handle the sync call exception
  61. process.on('uncaughtException', function (err) {
  62. console.error(err);
  63. });
  64. // now enable http server and socket.io
  65. let server;
  66. // https
  67. if(config.httpsOpen){
  68. let fs = require("fs");
  69. // Configuare https
  70. let httpsOption = {
  71. key : fs.readFileSync(config.httpsConfig.key),
  72. cert: fs.readFileSync(config.httpsConfig.pem)
  73. }
  74. server = require('https').createServer(app);
  75. }else{
  76. server = require('http').createServer(app);
  77. }
  78. let io = require('socket.io').listen(server);
  79. // let io = require('socket.io').listen(server,{path:"/mlw/im"}); //im子目录 nginx也需要修改
  80. server.listen(config.serverPort);
  81. // event listener for HTTP server "error" event
  82. server.on('error', function (error) {
  83. if (error.syscall !== 'listen') throw error;
  84. let bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port;
  85. // handle specific listen errors with friendly messages
  86. switch (error.code) {
  87. case 'EACCES':
  88. console.error(bind + ' requires elevated privileges');
  89. process.exit(1);
  90. break;
  91. case 'EADDRINUSE':
  92. console.error(bind + ' is already in use');
  93. process.exit(1);
  94. break;
  95. default:
  96. throw error;
  97. }
  98. });
  99. // event listener for HTTP server "listening" event
  100. server.on('listening', function onListening() {
  101. let addr = server.address();
  102. let bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port;
  103. log.info('bind'+bind);
  104. });
  105. let socketHandler = new SocketHandler(io);
  106. socketHandler.start();
  107. if(!server.address()){
  108. log.error('Starting IM server failed, port is already in used.');
  109. process.exit(1);
  110. } else {
  111. log.info('Starting IM server, version ' + config.version + ', running on port ' + server.address().port + ', ' + new Date().toLocaleString());
  112. log.info('Configuration profile: ' + configFile.split('.')[1]);
  113. }
  114. // JobInitializer.init();
  115. pubSub.registerHandlers(config.subChannel,msg=> console.log(msg));
  116. pubSub.subscribe(config.subChannel);