mvc.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //HTTP服务
  2. import HTTP = require('http');
  3. import URL = require('url');
  4. //表单处理器
  5. import formidable = require('formidable')
  6. //路由控制器
  7. import Router from './lib/router';
  8. //模型控制器
  9. import Module from './lib/module';
  10. import ControllerClass from './lib/controller';
  11. (global as any).CONTROLLER = ControllerClass;
  12. const IncomingForm = formidable.IncomingForm;
  13. class MVC {
  14. constructor(option:{root_path:string,server_port:number}) {
  15. //定义全局MVC框架变量
  16. const Root = `${SYSTEM.ROOTPATH}/${option.root_path}`;
  17. SYSTEM.MVC = {
  18. ROOT:Root,
  19. PORT:option.server_port,
  20. PATH:{
  21. MODULE:`${Root}/module`,
  22. CONTROLLER:`${Root}/controller`,
  23. VIEW:`${Root}/view`,
  24. },
  25. ROUTER_MAP:null,
  26. EJS:require('ejs')
  27. };
  28. //初始化Module控制器
  29. Module.init();
  30. //初始化MVC应用目录
  31. Object.keys(SYSTEM.MVC.PATH).forEach((path)=>{
  32. try{
  33. FILE.statSync(SYSTEM.MVC.PATH[path]);
  34. }catch(e:any){
  35. if(e.code=='ENOENT'){
  36. FILE.mkdirsSync(SYSTEM.MVC.PATH[path]);
  37. }
  38. }
  39. });
  40. //加载路由Map文件或初始化
  41. const mapFile = `${SYSTEM.MVC.ROOT}/map.json`;
  42. try{
  43. FILE.statSync(mapFile);
  44. SYSTEM.MVC.ROUTER_MAP = JSON.parse(FILE.readFileSync(mapFile,'UTF-8'));
  45. }catch(e:any){
  46. if(e.code=='ENOENT'){
  47. FILE.writeFileSync(mapFile,'{}','UTF-8');
  48. }else{
  49. LOGGER.error(`MVC Router map file [${mapFile}] parse error!`);
  50. }
  51. SYSTEM.MVC.ROUTER_MAP = {};
  52. }
  53. try{
  54. HTTP.createServer(this._serverHandler).listen(SYSTEM.MVC.PORT);
  55. LOGGER.info(`Http MVC Server start at port [${SYSTEM.MVC.PORT}]`);
  56. }catch(e:any){
  57. LOGGER.error(`Http MVC Server start failed at port [${SYSTEM.MVC.PORT}]`);
  58. LOGGER.error(e.stack);
  59. }
  60. }
  61. protected _serverHandler(req?:HTTP.IncomingMessage,res?:HTTP.ServerResponse){
  62. if(!req) return;
  63. const RequestData:RequestData = {
  64. req,res,
  65. path:'' as string|null,
  66. COOKIE:{} as any,
  67. GET:{},
  68. POST:{},
  69. UPLOAD:{}
  70. }
  71. req.headers.cookie && req.headers.cookie.split(';').forEach((Cookie)=>{
  72. const parts:Array<string> = Cookie.split('=');
  73. let key = parts.shift();
  74. if (key){
  75. key = key.trim();
  76. const value = parts.join('=').trim();
  77. RequestData.COOKIE[key] = value;
  78. }
  79. });
  80. const URLParse = URL.parse(req.url as string,true);
  81. if(URLParse){
  82. RequestData.path = URLParse.pathname,
  83. RequestData.GET = URLParse.query;
  84. }
  85. if(req.method && req.method.toLowerCase()=='post'){
  86. new IncomingForm().parse(req, (err, fields, files)=>{
  87. RequestData.POST = fields;
  88. RequestData.UPLOAD = files;
  89. Router.run(RequestData);
  90. });
  91. }else{
  92. Router.run(RequestData);
  93. }
  94. }
  95. }
  96. module.exports = MVC;