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}!`));