astroboy
Version:
Astroboy(阿童木)is a Nodejs SFB(Separation of Front and Back ends) framework, built on koa2.
110 lines • 4.49 kB
JavaScript
"use strict";
const path = require("path");
const Koa = require("koa");
const events_1 = require("events");
const CoreLoader_1 = require("./CoreLoader");
const BaseClass_1 = require("./base/BaseClass");
const completeAssign = require('complete-assign');
const mockKoa_1 = require("../core/lib/mockKoa");
const compose = require("koa-compose");
/**
* ## Astroboy Framework
*
* @author Big Mogician
* @class Astroboy
* @extends {EventEmitter}
* @template DEFINE Framework Definition, defalut is `IAstroboyFrameworkDefine`.
*/
class Astroboy extends events_1.EventEmitter {
constructor(options = {}) {
super();
this.extends = {
app: null,
context: null,
request: null,
response: null,
};
options.NODE_ENV =
process.env.APPLICATION_STANDARD_ENV || process.env.NODE_ENV || options.NODE_ENV || 'development';
options.NODE_PORT = process.env.NODE_PORT || options.NODE_PORT || '8201';
options.ROOT_PATH = options.ROOT_PATH || process.cwd();
this.options = options;
}
get [Symbol.for('BASE_DIR')]() {
return path.join(__dirname, '..');
}
async run() {
await this.init();
return new Promise((resolve) => {
this.on('start', () => resolve(this));
this.start();
});
}
async initAe() {
this.app = new Koa();
this.app.env = this.options.NODE_ENV;
this.app.proxy = this.options.PROXY;
this.app.MODE_AE = this.options.MODE_AE;
this.app.NODE_ENV = this.options.NODE_ENV;
this.app.ROOT_PATH = this.options.ROOT_PATH;
this.app.ROOT_NAME = path.basename(this.options.ROOT_PATH);
this.loader = new CoreLoader_1.CoreLoader({
astroboy: this,
app: this.app,
});
await this.loader.load();
completeAssign(mockKoa_1.application, this.app);
}
handleCtx(ctx) {
var _a, _b, _c, _d;
Object.setPrototypeOf(ctx.app, (this.extends.app = (_a = this.extends.app) !== null && _a !== void 0 ? _a : Object.setPrototypeOf(mockKoa_1.application, Object.getPrototypeOf(ctx.app))));
Object.setPrototypeOf(ctx.request, (this.extends.request = (_b = this.extends.request) !== null && _b !== void 0 ? _b : Object.setPrototypeOf(mockKoa_1.request, Object.getPrototypeOf(ctx.request))));
Object.setPrototypeOf(ctx.response, (this.extends.response = (_c = this.extends.response) !== null && _c !== void 0 ? _c : Object.setPrototypeOf(mockKoa_1.response, Object.getPrototypeOf(ctx.response))));
Object.setPrototypeOf(ctx, (this.extends.context = (_d = this.extends.context) !== null && _d !== void 0 ? _d : Object.setPrototypeOf(mockKoa_1.context, Object.getPrototypeOf(ctx))));
return compose(this.loader.middlewareList)(ctx);
}
async init() {
this.app = new Koa();
this.app.env = this.options.NODE_ENV;
this.app.proxy = this.options.PROXY;
this.app.NODE_ENV = this.options.NODE_ENV;
this.app.ROOT_PATH = this.options.ROOT_PATH;
this.app.ROOT_NAME = path.basename(this.options.ROOT_PATH);
this.loader = new CoreLoader_1.CoreLoader({
astroboy: this,
app: this.app,
});
await this.loader.load();
}
start() {
this.app.listen(this.options.NODE_PORT, () => {
console.log('应用启动成功');
console.log(`访问地址:${'http://127.0.0.1:' + this.options.NODE_PORT}`);
this.emit('start', this.app);
});
this.app.on('error', (err, ctx) => {
this.emit('error', err, ctx);
});
// 添加默认的 error 事件监听器
setTimeout(() => {
if (this.listenerCount('error') === 0) {
this.on('error', (err, ctx) => {
console.log('[default error callback]');
console.log(err);
});
}
}, 3000);
}
}
(function (Astroboy) {
/** ### Astroboy Base Class */
Astroboy.BaseClass = BaseClass_1.BaseClass;
/** ### Astroboy Controller Base */
Astroboy.Controller = BaseClass_1.BaseClass;
/** ### Astroboy Service Base */
Astroboy.Service = BaseClass_1.BaseClass;
/** ### Astroboy <Helper&Utils> Base */
Astroboy.Helper = BaseClass_1.BaseClass;
})(Astroboy || (Astroboy = {}));
module.exports = Astroboy;
//# sourceMappingURL=Astroboy.js.map