app.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. const express = require('express');
  2. const path = require('path');
  3. const app = express();
  4. const config = require('./config/app')
  5. const session = require('express-session');
  6. const RedisStore = require('connect-redis')(session);
  7. const cookieParser = require('cookie-parser');
  8. const bodyParser = require('body-parser');
  9. const compression = require('compression');
  10. const authChecker = require('./libs/auth/checker');
  11. // const helmet = require('helmet'); // 安全中间件,主要添加一些安全头
  12. const rateLimit = require('express-rate-limit'); // 速率限制,预防ddos攻击
  13. // const cors = require('cors');
  14. // 使用 Helmet 中间件
  15. // app.use(helmet());
  16. // 创建速率限制器
  17. const apiLimiter = rateLimit({
  18. windowMs: 15 * 60 * 1000, // 15分钟
  19. max: 100, // 每个IP在15分钟内最多100个请求
  20. standardHeaders: 'draft-7', // 使用draft-7版本的RateLimit头
  21. legacyHeaders: false // 禁用X-RateLimit-*头
  22. });
  23. app.use('/api/', apiLimiter); // api 接口启用限制
  24. // app.use(cors()); // 启用CORS
  25. app.set('trust proxy', 1) //trust first proxy, get ip
  26. // 设置视图引擎为EJS
  27. app.set('view engine', 'ejs');
  28. // 设置视图目录
  29. app.set('views', [
  30. path.join(__dirname, 'views'),
  31. path.join(__dirname, 'views/v2'),
  32. ]);
  33. /**
  34. * Check should compress.
  35. */
  36. function shouldCompress(req, res) {
  37. if (req.headers['x-no-compression']) {
  38. // don't compress responses with this request header
  39. return false
  40. }
  41. // fallback to standard filter function
  42. return compression.filter(req, res)
  43. }
  44. app.use(compression({
  45. filter: shouldCompress
  46. }));
  47. app.use(cookieParser());
  48. app.use(express.static(config.STATIC_DIR));
  49. app.use(express.static(path.join(__dirname, 'dist')));
  50. app.use(session({
  51. store: new RedisStore({
  52. prefix: 'artsite_sess:'
  53. }),
  54. cookie: config.cookie,
  55. saveUninitialized: false,
  56. secret: 'MhxzKhl123.',
  57. resave: false,
  58. name: config.sessionName || sid,
  59. }));
  60. app.use(bodyParser.json());
  61. app.use(bodyParser.urlencoded({
  62. extended: false
  63. }));
  64. // 自定义日志中间件
  65. app.use((req, res, next) => {
  66. const now = new Date().toISOString();
  67. const ip = req.headers['x-forwarded-for'] || req.ip;
  68. console.log(`[${now}] ${ip} ${req.method} ${req.url}`);
  69. next(); // 调用 next() 函数,将请求传递给下一个中间件或路由处理程序
  70. });
  71. app.use('/napi/web/auth', require('./routes/napi/web/auth'));
  72. app.use('/napi/web/menu', authChecker.checkLogin, require('./routes/napi/web/menu'));
  73. app.use('/napi/web/art', authChecker.checkLogin, require('./routes/napi/web/art'));
  74. app.use('/napi/web/user', authChecker.checkLogin, require('./routes/napi/web/user'));
  75. app.use('/napi/web/role', authChecker.checkLogin, require('./routes/napi/web/role'));
  76. app.use('/thumbs/v1', require('./routes/res/thumbs'));
  77. app.use('/proxy', require('./routes/proxy'));
  78. //v2
  79. app.use('/', require('./routes/v2/index')); // 首页和具体分类合集页
  80. app.use('/coloring-page', require('./routes/v2/detail')) // 详情页
  81. app.use('/coloring-pages', require('./routes/v2/coloring-pages')) // 所有精选合集页
  82. app.use('/coloring-page-gallery', require('./routes/v2/gallery')) // 图库页
  83. app.use('/share', require('./routes/v2/share')) // deeplink share专属页面
  84. ////////////////////////// 合集 //////////////////////////////
  85. app.use('/summer-coloring-pages', require('./routes/v2/coloring-page-collection')) // flower coloring pages 合集
  86. app.use('/flower-coloring-pages', require('./routes/v2/coloring-page-collection')) // flower coloring pages 合集
  87. app.use('/mandala-coloring-pages', require('./routes/v2/coloring-page-collection')) // mandala coloring pages 合集
  88. app.use('/zentangle-coloring-pages', require('./routes/v2/coloring-page-collection')) // zentangle coloring pages 合集
  89. app.use('/zen-coloring-pages', require('./routes/v2/coloring-page-collection')) // zen coloring pages 合集
  90. app.use('/cat-coloring-pages', require('./routes/v2/coloring-page-collection')) // cat coloring pages 合集
  91. app.use('/butterfly-coloring-pages', require('./routes/v2/coloring-page-collection'))
  92. app.use('/architecture-coloring-pages', require('./routes/v2/coloring-page-collection'))
  93. app.use('/simple-coloring-pages', require('./routes/v2/coloring-page-collection'))
  94. app.use('/girl-coloring-pages', require('./routes/v2/coloring-page-collection'))
  95. app.use('/fantasy-coloring-pages', require('./routes/v2/coloring-page-collection'))
  96. app.use('/christmas-coloring-pages', require('./routes/v2/coloring-page-collection'))
  97. app.use('/patterns-coloring-pages', require('./routes/v2/coloring-page-collection'))
  98. app.use('/peacock-coloring-pages', require('./routes/v2/coloring-page-collection'))
  99. app.use('/dragon-coloring-pages', require('./routes/v2/coloring-page-collection'))
  100. app.use('/unicorn-coloring-pages', require('./routes/v2/coloring-page-collection'))
  101. app.use('/food-coloring-pages', require('./routes/v2/coloring-page-collection'))
  102. app.use('/video-coloring-pages', require('./routes/v2/video-coloring-page'))
  103. app.use('/tips-tricks', require('./routes/v2/tips-tricks'));
  104. app.use('/download', require('./routes/res/download'));
  105. app.use('/api/comment', require('./routes/v2/comment')); // 评论
  106. app.use('/api/contact', require('./routes/v2/contact')); // 联系信息
  107. app.use('/api/subscribe', require('./routes/v2/subscribe')); // 用户提交邮箱订阅
  108. app.use('/api/tasks', require('./routes/v2/tasks')); // 用户分享前提交task列表
  109. //v1
  110. app.use('/', require('./routes/index'));
  111. // catch 404 and forward to error handler
  112. app.use(function (req, res) {
  113. // 设置状态码为404
  114. res.status(404);
  115. // res.sendFile(path.join(__dirname, '404.html'));
  116. res.render('404', { title: '404 Error', description: 'PAGE NOT FOUND' });
  117. });
  118. // error handler
  119. app.use(function (err, req, res, next) {
  120. // set locals, only providing error in development
  121. res.locals.message = err.message;
  122. res.locals.error = req.app.get('env') === 'development' ? err : {};
  123. console.log("error:" + err + " status: ");
  124. // render the error page
  125. res.status(err.status || 404);
  126. res.render('404', { title: '404 Error', description: 'PAGE NOT FOUND' });
  127. });
  128. // 启动服务器,监听6889端口
  129. const PORT = process.env.PORT || 6889;
  130. app.listen(PORT, () => {
  131. console.log(`Server is running on http://localhost:${PORT}`);
  132. });