UNPKG

ibird-core

Version:

The core module of ibird.

113 lines (99 loc) 4.15 kB
'use strict'; /** * Koa基础配置模块 * Created by yinfxs on 2017/4/5. */ const path = require('path'); const fs = require('fs-extra'); const Koa = require('koa'); const Router = require('koa-router'); const koaBody = require('koa-body'); const cors = require('kcors'); const serve = require('koa-static'); const mount = require('koa-mount'); const config = require('./config'); const route = require('./route'); module.exports = exports; /** * 启动应用 * @returns {Promise.<void>} */ exports.run = async () => { const app = new Koa(); const router = new Router(); config.router = router; config.trigger.emit('ibird_app_all_before', app, router, config); //是否支持文件上传 config.multipart = (typeof config.multipart === 'boolean') ? config.multipart : false; const bodyOpts = Object.assign(config.bodyOpts || {}, { strict: false }); if (config.multipart) { config.uploadPath = config.uploadPath || path.resolve(process.cwd(), 'public/uplaod'); Object.assign(bodyOpts, { multipart: true, formidable: Object.assign({ keepExtensions: true, uploadDir: config.uploadPath, hash: 'sha1' }, config.formidable || {}) }); config.uploadPath = bodyOpts.formidable.uploadDir || config.uploadPath; fs.ensureDirSync(config.uploadPath); } app.use(koaBody(bodyOpts)); //是否存在需要挂载的静态路径 if (typeof config.static === 'object') { config.trigger.emit('ibird_app_static_before', app, router, config); for (const key in config.static) { if (!key || !key.startsWith('/')) continue; const value = config.static[key]; if (!value) continue; fs.ensureDirSync(value); app.use(mount(key, serve(value))); } config.trigger.emit('ibird_app_static_success', app, router, config); } //检测是否存在跨域配置 if (config.cross) { const cors_options = (typeof config.cross === 'object') ? config.cross : {}; app.use(cors(cors_options)); } //挂载注入的中间件 if (Array.isArray(config.middleware) && config.middleware.length > 0) { config.trigger.emit('ibird_app_middleware_before', app, router, config); for (const item of config.middleware) { if (!item || typeof item !== 'function') continue; item(app); } config.trigger.emit('ibird_app_middleware_success', app, router, config); } //设置接口前缀 if (config.prefix) router.prefix(config.prefix); //路由挂载:1.挂载模型默认路由部分 if ((typeof config.schema === 'object') && Object.keys(config.schema).length > 0) { config.trigger.emit('ibird_route_model_before', app, router, config); for (const name in config.schema) { const item = config.schema[name]; if (typeof name !== 'string' || typeof item !== 'object') continue; config.trigger.emit(`ibird_route_model_${name}_before`, name, app, router, config); route.model(router, item); config.trigger.emit(`ibird_route_model_${name}_success`, name, app, router, config); } config.trigger.emit('ibird_route_model_success', app, router, config); } //路由挂载:2.挂载自定义路由部分 if (Array.isArray(config.route) && config.route.length > 0) { config.trigger.emit('ibird_route_mount_before', app, router, config); for (const item of config.route) { if (!item || typeof item !== 'function') continue; item(router); } config.trigger.emit('ibird_route_mount_success', app, router, config); } //初始化应用监听端口 // config.port = (typeof config.port === 'number') && !Number.isNaN(config.port) ? config.port : 3000; app.use(router.routes()).use(router.allowedMethods()); if (config.port) app.listen(config.port); config.trigger.emit('ibird_app_start_success', app); exports.app = app; return app; };