65 lines
1.8 KiB
JavaScript
65 lines
1.8 KiB
JavaScript
import express from 'express';
|
|
import bodyParser from 'body-parser';
|
|
import dotenv from 'dotenv';
|
|
// 配置 dotenv
|
|
dotenv.config();
|
|
|
|
import BrowserManager from './lib/browser.js';
|
|
import StorageManager from './lib/storage.js';
|
|
import {pdfHandler, posterHandler, statusHandler} from './lib/routes.js';
|
|
|
|
// 初始化存储管理器
|
|
const storageManager = new StorageManager(process.env);
|
|
|
|
// 初始化浏览器管理器
|
|
const browserManager = new BrowserManager();
|
|
await browserManager.initBrowser(2);
|
|
|
|
const app = express();
|
|
app.use(bodyParser.json({limit: '10mb'}));
|
|
// 提供上传文件的静态访问
|
|
app.use('/uploads', express.static('uploads'));
|
|
// 健康检查接口
|
|
app.get('/status', statusHandler);
|
|
|
|
// 添加安全头
|
|
app.use((req, res, next) => {
|
|
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
res.setHeader('X-Frame-Options', 'DENY');
|
|
res.setHeader('X-XSS-Protection', '1; mode=block');
|
|
next();
|
|
});
|
|
|
|
// 海报生成接口
|
|
app.post('/api/v1/poster', async function (req, res) {
|
|
// 基本的安全检查
|
|
if (!req.headers['content-type'] || !req.headers['content-type'].includes('application/json')) {
|
|
return res.status(400).json({error: 'Content-Type must be application/json'});
|
|
}
|
|
|
|
await posterHandler(
|
|
req,
|
|
res,
|
|
browserManager,
|
|
storageManager
|
|
);
|
|
});
|
|
|
|
// PDF生成接口
|
|
app.post('/api/v1/pdf', async function (req, res) {
|
|
// 基本的安全检查
|
|
if (!req.headers['content-type'] || !req.headers['content-type'].includes('application/json')) {
|
|
return res.status(400).json({error: 'Content-Type must be application/json'});
|
|
}
|
|
|
|
await pdfHandler(
|
|
req,
|
|
res,
|
|
browserManager,
|
|
storageManager
|
|
);
|
|
});
|
|
|
|
const port = process.env.PORT || 3000;
|
|
app.listen(port, () => console.log(`Puppeteer app listening on port ${port}!`));
|