node-web-mvc
Version:
node spring mvc
67 lines (66 loc) • 3.01 kB
JavaScript
;
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;