node-web-mvc
Version:
node spring mvc
63 lines (62 loc) • 2.22 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/**
* @module MessageConverter
* @description 内容转换器
*/
const HttpMediaTypeNotSupportedException_1 = __importDefault(require("../../../errors/HttpMediaTypeNotSupportedException"));
const HttpMethod_1 = __importDefault(require("../HttpMethod"));
const NO_VALUE = {};
const SUPPORTED_METHODS = new Set([
HttpMethod_1.default.POST,
HttpMethod_1.default.PUT,
HttpMethod_1.default.PATCH,
]);
class MessageConverter {
constructor() {
this.registerConverters = [];
}
/**
* 注册一个消息转换器
* @param servletContext
*/
addMessageConverters(...converter) {
this.registerConverters.push(...converter);
}
forEach(handler) {
return this.registerConverters.forEach(handler);
}
/**
* 当前当前http的内容
*/
async read(servletContext, dataType) {
const request = servletContext.request;
const mediaType = request.mediaType;
const httpMethod = request.method;
const converter = this.registerConverters.find((converter) => converter.canRead(dataType, mediaType));
let body = NO_VALUE;
if (converter) {
body = await converter.read(servletContext, dataType);
}
if (body !== NO_VALUE) {
return body;
}
if (!httpMethod || !SUPPORTED_METHODS.has(httpMethod) || (mediaType.isEmpty() && request.nativeRequest.readableLength < 1)) {
return null;
}
throw new HttpMediaTypeNotSupportedException_1.default(mediaType);
}
/**
* 写出内容到response中
*/
async write(body, mediaType, servletContext) {
const data = await Promise.resolve(body);
const dataType = data === null || data === void 0 ? void 0 : data.constructor;
const converter = this.registerConverters.find((converter) => converter.canWrite(dataType, mediaType));
return converter.write(data, servletContext);
}
}
exports.default = MessageConverter;