const express = require('express'); const mysql = require("mysql"); const bodyParse = require('body-parser'); const utils = require('./utils'); const event = require('./event'); const config = require('./config'); const db = require('./db'); const error = require('./error'); const app = express(); const handlers = {}; const middlewares = {}; const dbPools = {}; let sessionClass = null; let useMiddlewares = []; function listen(port) { app.listen(port); } function get() { } function init() { event.emitEvent(event.APP_INITIALIZED_EVENT); } function registerHandler(c, a, cb) { handlers[a + '@' + c] = { 'cb': cb, 'middlewares': useMiddlewares }; } function injectionSession(sessionCls) { sessionClass = sessionCls; } function addMiddleware(name, cb) { middlewares[name] = cb; } function useMiddleware(list, cb) { try { useMiddlewares = []; list.forEach((name) => { useMiddlewares.push(middlewares[name]); }); cb(); } finally { useMiddlewares = []; } } function registerDb(name, options) { dbPools[name] = { 'options': options, 'pool': mysql.createPool({ host : options['host'], user : options['user'], password : options['passwd'], database : options['database'], stringifyObjects : true }) }; } function getDbConn(name) { const ret = { err: null, conn: null, }; return new Promise((resolve) => { if (!(name in dbPools)) { ret.err = 'dbname not exists ' + name; resolve(ret); return; } const pool = dbPools[name]['pool']; pool.getConnection(function(err, conn) { ret.err = err; ret.conn = new db(conn); resolve(ret); }); }); } process.on('unhandledRejection', (reason, promise) => { console.log('Unhandled Rejection at:', promise, 'reason:', reason); throw reason; }); app.get('/webapp/index.php', async (req, rsp) => { const c = req.query.c; const a = req.query.a; const handler = handlers[a + '@' + c]; try { if (handler) { const cb = handler['cb']; const middlewares = handler['middlewares']; if (sessionClass) { const session = new sessionClass(req, rsp); try { await Promise.all(middlewares.map(async (m) => { await m(session); })); await cb(session); } finally { await session.destory(); } } else { await Promise.all(middlewares.map(async (m) => { await m(req, rsp); })); await cb(req, rsp); } } else { utils.rspErr(rsp, 100, 'not found'); } } catch (err) { if (err instanceof error.InternalError) { utils.rspErr(rsp, err.errCode, err.errMsg); } else { throw err; } } }); function post(...args) { app.post(...args); } function addStaticDirectory(path, dir) { app.use(path, express.static(dir)); } function getNodeId() { return Number(utils.getArgv('n')); } function getInstanceId() { return Number(utils.getArgv('i')); } registerHandler('Ops', 'selfChecking', async (req, rsp) => { if (rsp) { utils.rspOk(rsp); } else { req.rspOk(); } }); app.use(bodyParse.json({ limit: '50mb'})); app.use(bodyParse.urlencoded({ limit: '50mb', extended: true})); exports.init = init; exports.listen = listen; exports.get = get; exports.post = post; exports.registerHandler = registerHandler; exports.injectionSession = injectionSession; exports.addMiddleware = addMiddleware; exports.useMiddleware = useMiddleware; exports.registerDb = registerDb; exports.getDbConn = getDbConn; exports.addStaticDirectory = addStaticDirectory; exports.getNodeId = getNodeId; exports.getInstanceId = getInstanceId;