Files
tonePage/Server/src/Plugs/API/APILoader.ts

53 lines
2.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import express, { NextFunction, Request, Response } from "express";
import cors from "cors";
import Logger from "../Logger";
import { API } from "./API";
import ServerStdResponse from "../../ServerStdResponse";
class APILoader {
private app = express();
private logger = new Logger('APILoader');
constructor(private port?: number) {
this.logger.info('API服务加载中...');
this.app.use(express.json({ limit: '50mb' }));
this.app.use(express.urlencoded({ extended: true }));
this.app.use(cors({
origin: ['http://localhost:5173', 'http://www.tonesc.cn', 'https://www.tonesc.cn', 'http://tonesc.cn', 'https://tonesc.cn'],
methods: ['GET', 'POST', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization', 'Access-Control-Allow-Origin', ''],
}));
}
add(api: { new(): API }) {
const instance = new api();
for (let func of instance.middlewareFunc) {
this.app[instance.method.toLowerCase() as keyof express.Application](instance.path, (req: Request, res: Response, next: NextFunction) => {
func(req, res, next);
});
this.logger.info(`[${instance.method}][${instance.path}] 已启用中间件[${func.name}]`);
}
this.app[instance.method.toLowerCase() as keyof express.Application](instance.path, (req: Request, res: Response) => {
let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.ip;
this.logger.info(`[${instance.method}][${instance.path}] 被请求[${(ip as string).replace('::ffff:', '')}]`);
const data = Object.assign({}, req.query, req.body);
instance.onRequset(data, res);
});
this.logger.info(`[${instance.method}][${instance.path}] 加载成功`);
}
start(port?: number) {
if (this.port == undefined && port == undefined)
throw new Error('未指定API端口')
this.app.use((req: Request, res: Response) => {
this.logger.info(`[${req.method}][${req.url.split('?')[0]}] 该API不存在`);
res.json(ServerStdResponse.API_NOT_FOUND)
})
this.app.listen(port || this.port, () => {
this.logger.info(`已全部加载完成API服务开放在端口${port || this.port}`);
});
}
}
export {
APILoader,
}