import path from 'path'; import { dirname } from 'path'; import { fileURLToPath } from 'url'; import Koa from 'koa'; import getRouter from 'koa-router'; import koaBody from 'koa-body'; import fs from "fs"; // 静态文件服务 import koaStatic from 'koa-static' // 虚拟路径 import koaMount from 'koa-mount'; // import { ConfigHelper, DBHelper } from "funjia-server/lib/funjia-server.mjs"; import ConfigHelper from './ConfigHelper.mjs'; import DBHelper from './DBHelper.mjs'; const __dirname = dirname(fileURLToPath( import.meta.url)); ConfigHelper.initConfig(); (async () => await DBHelper.init())(); export default CreateServer /** * 创建服务 * port: 服务端口号 */ function CreateServer(port = 4873) { const router = new getRouter(); const app = new Koa(); app.use(koaBody()); const staticPath = './static' app.use( koaMount('/resource/static', koaStatic( path.join(__dirname, staticPath), {} )) ) // app.use(koaStatic('.')); app.use(router.routes()); app.use(router.allowedMethods()); // 初始化路由 const initRouter = (folderPath: string) => { // 读取文件夹中的文件列表 fs.readdir(folderPath, async (err, files) => { if (err) { console.error('Error reading directory:', err); return; } // 筛选出.js 文件 // const jsFiles = files.filter(file => path.extname(file) === '.mjs'); for (const file of files) { try { const filePath = path.join(folderPath, file); const stats = await fs.statSync(filePath); if (stats.isDirectory()) { await initRouter(filePath); } else if (stats.isFile()) { // 构建文件的完整路径 const filePath = path.join(folderPath, file); // 动态导入文件 const module = await import("./" + path.relative(__dirname, filePath)); // 在这里可以对导入的模块进行处理,例如调用其中的函数或使用其导出的对象 module.default(router); // console.log(module); } } catch (error) { console.error(`Error importing ${file}:`, error); } } }); } (async () => { // 目标文件夹的路径 const folderPath = './routers'; await initRouter(folderPath); })(); let server = null; const startServer = () => { server = app.listen(port, () => { console.log('server is listen in ', port); }); server.on('close', (err: any, socket: any) => { server = null; console.log('server is close'); }); } startServer(); } // const bH = new BackupHelper(); // 调度任务 (该模块内存占用会持续上升不建议使用,建议使用系统本身的调度任务) // const task = cron.schedule('* */1 * * * Sunday', () => { // console.log('running a task every 10 seconds'); // task.stop(); // server.close(async () => { // await bH.bakFile(ConfigHelper.config.dbBak); // startServer(); // }); // }, { // scheduled: false, // // https://timezonedb.com/download // timezone: "Asia/Shanghai" // }); // task.start(); // const delay = () => new Promise((resolve) => { // setTimeout(() => { // resolve(true); // }, 1000 * 10); // }); // (async () => { // for (let i = 0; i < 20; i++) { // console.log('running a task every 10 seconds'); // await delay(); // await bH.bakFile(ConfigHelper.config.dbBak); // } // })();