UNPKG

node-web-mvc

Version:
67 lines (66 loc) 3.01 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const metadata_1 = require("../annotations/annotation/metadata"); const HttpStatus_1 = __importDefault(require("../http/HttpStatus")); const MethodParameter_1 = __importDefault(require("./MethodParameter")); const HandlerMethodReturnValueHandlerComposite_1 = __importDefault(require("./return/HandlerMethodReturnValueHandlerComposite")); const NOOP = {}; class ServletInvocableHandlerMethod { constructor(handlerMethod) { this.handlerMethod = handlerMethod; } setReturnValueHandlers(handlers) { this.returnvalueHandlers = handlers; } /** * 执行方法 */ async invoke(servletContext, mavContainer, args) { const handlerMethod = this.handlerMethod; if (!handlerMethod.method) { return null; } const response = servletContext.response; const bean = handlerMethod.bean || NOOP; // 优先从实例中获取method 用于支持aop代理 const method = bean[handlerMethod.methodName] || handlerMethod.method; const returnValue = await Promise.resolve(method.call(bean, ...args)); this.setResponseStatus(servletContext); // 设置请求是否已处理 mavContainer.requestHandled = response.headersSent; mavContainer.status = response.status; // 如果response已处理结束 if (response.headersSent) { return null; } // 如果通过ResponseStatus指定了返回状态原因,则不执行返回处理 if (handlerMethod.responseStatusReason) { return; } const runtimeType = (0, metadata_1.buildRuntimeType)(returnValue === null || returnValue === void 0 ? void 0 : returnValue.constructor, null); const returnType = new MethodParameter_1.default(handlerMethod.beanType, handlerMethod.methodName, '', -1, runtimeType); const returnHandlers = new HandlerMethodReturnValueHandlerComposite_1.default(this.returnvalueHandlers); await returnHandlers.handleReturnValue(returnValue, returnType, servletContext, mavContainer); mavContainer.requestHandled = response.headersSent; mavContainer.status = response.status; return returnValue; } setResponseStatus(servletContext) { const handlerMethod = this.handlerMethod; const response = servletContext.response; if (!handlerMethod.responseStatus) { return; } if (handlerMethod.responseStatusReason) { const status = new HttpStatus_1.default(handlerMethod.responseStatus, handlerMethod.responseStatusReason); response.sendError(status); } else { response.setStatus(handlerMethod.responseStatus); } } } exports.default = ServletInvocableHandlerMethod;