90 lines
3.2 KiB
TypeScript
90 lines
3.2 KiB
TypeScript
import * as express from 'express';
|
||
import * as path from 'path';
|
||
import * as fs from 'fs';
|
||
import * as morgan from 'morgan';
|
||
import signaling from './signaling';
|
||
import { log, LogLevel } from './log';
|
||
import Options from './class/options';
|
||
import { reset as resetHandler }from './class/httphandler';
|
||
import { initSwagger } from './swagger';
|
||
|
||
const cors = require('cors');
|
||
const multer = require('multer');
|
||
|
||
export const createServer = (config: Options): express.Express => {
|
||
const app: express.Express = express();
|
||
resetHandler(config.mode);
|
||
// logging http access
|
||
if (config.logging != "none") {
|
||
app.use(morgan(config.logging));
|
||
}
|
||
// const signal = require('./signaling');
|
||
app.use(cors({origin: '*'}));
|
||
app.use(express.urlencoded({ extended: true }));
|
||
app.use(express.json());
|
||
app.get('/config', (req, res) => res.json({ useWebSocket: config.type == 'websocket', startupMode: config.mode, logging: config.logging }));
|
||
app.use('/signaling', signaling);
|
||
app.use(express.static(path.join(__dirname, '../client/public')));
|
||
app.use('/module', express.static(path.join(__dirname, '../client/src')));
|
||
app.get('/', (req, res) => {
|
||
const indexPagePath: string = path.join(__dirname, '../client/public/index.html');
|
||
fs.access(indexPagePath, (err) => {
|
||
if (err) {
|
||
log(LogLevel.warn, `Can't find file ' ${indexPagePath}`);
|
||
res.status(404).send(`Can't find file ${indexPagePath}`);
|
||
} else {
|
||
res.sendFile(indexPagePath);
|
||
}
|
||
});
|
||
});
|
||
// 初始化Swagger
|
||
initSwagger(app, config);
|
||
|
||
// 配置multer存储
|
||
const storage = multer.diskStorage({
|
||
destination: function (req: any, file: any, cb: (error: Error | null, destination: string) => void) {
|
||
// 确保上传目录存在
|
||
const uploadDir = path.join(__dirname, '../client/public/uploads/avatars');
|
||
if (!fs.existsSync(uploadDir)) {
|
||
fs.mkdirSync(uploadDir, { recursive: true });
|
||
}
|
||
cb(null, uploadDir);
|
||
},
|
||
filename: function (req: any, file: any, cb: (error: Error | null, filename: string) => void) {
|
||
// 临时使用原始文件名,稍后在API处理中重命名
|
||
cb(null, file.originalname);
|
||
}
|
||
});
|
||
|
||
const upload = multer({ storage: storage });
|
||
|
||
// 头像上传API
|
||
app.post('/api/upload/avatar', upload.single('avatar'), (req: any, res: express.Response) => {
|
||
if (!req.file) {
|
||
return res.status(400).json({ success: false, message: 'No file uploaded' });
|
||
}
|
||
|
||
const userId = req.body.userId || 'unknown';
|
||
const ext = path.extname(req.file.originalname);
|
||
const oldPath = req.file.path;
|
||
const newFilename = `${userId}${ext}`;
|
||
const newPath = path.join(path.dirname(oldPath), newFilename);
|
||
|
||
// 重命名文件
|
||
fs.rename(oldPath, newPath, (err) => {
|
||
if (err) {
|
||
console.error('Error renaming file:', err);
|
||
return res.status(500).json({ success: false, message: '文件重命名失败' });
|
||
}
|
||
|
||
const avatarUrl = `/uploads/avatars/${newFilename}`;
|
||
res.json({ success: true, avatarUrl: avatarUrl });
|
||
});
|
||
});
|
||
|
||
// 确保uploads目录可访问
|
||
app.use('/uploads', express.static(path.join(__dirname, '../client/public/uploads')));
|
||
|
||
return app;
|
||
};
|