mm_os
Version:
MM_OS服务端架构,用于快速构建应用程序,支持网站建设、小程序后台、AI应用、物联网(IOT/AIOT)、游戏服务端等多种场景。
114 lines (104 loc) • 2.71 kB
JavaScript
const compress = require('koa-compress');
const send = require('koa-send');
const { koaBody } = require('koa-body');
const xmlParser = require('mm_xml');
const { session } = require('mm_session');
/**
* web基础
* @param {object} server 服务
*/
module.exports = {
/**
* 初始化
* @param {object} adapter 适配器集合
*/
init(adapter) {
// 参数校验
if (typeof adapter !== 'object') {
throw new TypeError('参数类型错误');
}
// 获取web服务
var web = adapter.web;
// 获取配置
let cg = { ...this.config, ...adapter.web.config };
this._setupFileSend(web);
this._setupSession(web, cg);
this._setupCompress(web, cg);
this._setupParsers(web, cg);
},
/**
* 设置文件发送
* @private
* @param {object} web web服务
*/
_setupFileSend(web) {
web.use(async (ctx, next) => {
// 设置文件发送方法,错误由web_error中间件统一处理
ctx.send = async function (src) {
await send(ctx, src);
};
await next();
});
},
/**
* 设置会话
* @private
* @param {object} web web服务
* @param {object} cg 配置
*/
_setupSession(web, cg) {
// 设置session 保存时长2小时
web.use(session({
max_age: $.login_period || cg.max_age || 7200
}));
},
/**
* 设置压缩
* @private
* @param {object} web web服务
* @param {object} cg 配置
*/
_setupCompress(web, cg) {
if (cg.compress) {
web.use(compress({
filter: (content_type) => /text|json|javascript|css|xml/.test(content_type),
thresh: cg.threshold || 1024,
gzip: {
flush: require('zlib').constants.Z_SYNC_FLUSH
},
brotli: {
flush: require('zlib').constants.BROTLI_OPERATION_FLUSH
}
}));
}
},
/**
* 设置解析器
* @private
* @param {object} web web服务
* @param {object} cg 配置
*/
_setupParsers(web, cg) {
// 解析 text/xml
web.use(xmlParser());
// 解析请求体
web.use(koaBody({
jsonLimit: cg.json_limit || '20mb',
multipart: true, // 必须开启才能解析 form-data
urlencoded: true, // 可选:解析 URL 编码的表单
text: true,
json: true, // 可选:解析 JSON
patchNode: true,
patchKoa: true,
formidable: {
maxFileSize: cg.max_file_size || 2000 * 1024 * 1024
}
}));
web.use(async (ctx, next) => {
if (!ctx.request.body) {
ctx.request.body = {};
}
await next();
});
}
};