handlerService.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. var fs = require('fs');
  2. var utils = require('../../util/utils');
  3. var Loader = require('pomelo-loader');
  4. var pathUtil = require('../../util/pathUtil');
  5. var logger = require('pomelo-logger').getLogger('pomelo', __filename);
  6. var forwardLogger = require('pomelo-logger').getLogger('forward-log', __filename);
  7. /**
  8. * Handler service.
  9. * Dispatch request to the relactive handler.
  10. *
  11. * @param {Object} app current application context
  12. */
  13. var Service = function(app, opts) {
  14. this.app = app;
  15. this.handlerMap = {};
  16. if(!!opts.reloadHandlers) {
  17. watchHandlers(app, this.handlerMap);
  18. }
  19. };
  20. module.exports = Service;
  21. Service.prototype.name = 'handler';
  22. /**
  23. * Handler the request.
  24. */
  25. Service.prototype.handle = function(routeRecord, msg, session, cb) {
  26. // the request should be processed by current server
  27. var handler = this.getHandler(routeRecord);
  28. if(!handler) {
  29. logger.error('[handleManager]: fail to find handler for %j', msg.__route__);
  30. utils.invokeCallback(cb, new Error('fail to find handler for ' + msg.__route__));
  31. return;
  32. }
  33. var start = Date.now();
  34. handler[routeRecord.method](msg, session, function(err, resp, opts) {
  35. var log = {
  36. route : msg.__route__,
  37. args : msg,
  38. time : utils.format(new Date(start)),
  39. timeUsed : new Date() - start
  40. };
  41. forwardLogger.info(JSON.stringify(log));
  42. utils.invokeCallback(cb, err, resp, opts);
  43. });
  44. return;
  45. };
  46. /**
  47. * Get handler instance by routeRecord.
  48. *
  49. * @param {Object} handlers handler map
  50. * @param {Object} routeRecord route record parsed from route string
  51. * @return {Object} handler instance if any matchs or null for match fail
  52. */
  53. Service.prototype.getHandler = function(routeRecord) {
  54. var serverType = routeRecord.serverType;
  55. if(!this.handlerMap[serverType]) {
  56. loadHandlers(this.app, serverType, this.handlerMap);
  57. }
  58. var handlers = this.handlerMap[serverType] || {};
  59. var handler = handlers[routeRecord.handler];
  60. if(!handler) {
  61. logger.warn('could not find handler for routeRecord: %j', routeRecord);
  62. return null;
  63. }
  64. if(typeof handler[routeRecord.method] !== 'function') {
  65. logger.warn('could not find the method %s in handler: %s', routeRecord.method, routeRecord.handler);
  66. return null;
  67. }
  68. return handler;
  69. };
  70. /**
  71. * Load handlers from current application
  72. */
  73. var loadHandlers = function(app, serverType, handlerMap) {
  74. var p = pathUtil.getHandlerPath(app.getBase(), serverType);
  75. if(p) {
  76. handlerMap[serverType] = Loader.load(p, app);
  77. }
  78. };
  79. var watchHandlers = function(app, handlerMap) {
  80. var p = pathUtil.getHandlerPath(app.getBase(), app.serverType);
  81. if (!!p){
  82. fs.watch(p, function(event, name) {
  83. if(event === 'change') {
  84. handlerMap[app.serverType] = Loader.load(p, app);
  85. }
  86. });
  87. }
  88. };