main.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import 'dotenv/config';
  2. import mongoose from 'mongoose';
  3. import express from 'express';
  4. import expressWs from 'express-ws';
  5. import cookieParser from 'cookie-parser';
  6. import Logs from './libs/logs.js';
  7. import authRoutes from './routes/auth.js';
  8. import gamesRoutes from './routes/games.js';
  9. import localesRoutes from './routes/locales.js';
  10. import platformsRoutes from './routes/platforms.js';
  11. import requireAuth from './middleware/requireAuth.js';
  12. import requireInternalToken from './middleware/requireInternalToken.js';
  13. const app = express();
  14. const wsInstance = expressWs(app);
  15. // 添加 CORS 支持.env
  16. app.use((req, res, next) => {
  17. const origin = req.headers.origin;
  18. res.header('Access-Control-Allow-Origin', origin || '*');
  19. res.header('Access-Control-Allow-Credentials', 'true');
  20. res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Internal-Token');
  21. res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  22. res.header('Vary', 'Origin');
  23. if (req.method === 'OPTIONS') {
  24. return res.sendStatus(200);
  25. }
  26. next();
  27. });
  28. // 中间件
  29. app.use(express.json({ limit: '10mb' }));
  30. app.use(cookieParser());
  31. app.use((req, res, next) => {
  32. res.badRequest = (data, msg) => {
  33. if (!msg && typeof data === 'string') {
  34. msg = data;
  35. data = undefined;
  36. }
  37. return res.status(400).json({ statusCode: 400, code: -1, message: msg ?? 'Bad Request', data });
  38. }
  39. res.unauthorized = (data, msg) => {
  40. if (!msg && typeof data === 'string') {
  41. msg = data;
  42. data = undefined;
  43. }
  44. return res.status(401).json({ statusCode: 401, code: -1, message: msg ?? 'Unauthorized', data });
  45. }
  46. res.notFound = (data, msg) => {
  47. if (!msg && typeof data === 'string') {
  48. msg = data;
  49. data = undefined;
  50. }
  51. return res.status(404).json({ statusCode: 404, code: -1, message: msg ?? 'Not Found', data });
  52. }
  53. res.serverError = (data, msg) => {
  54. if (!msg && typeof data === 'string') {
  55. msg = data;
  56. data = undefined;
  57. }
  58. return res.status(500).json({ statusCode: 500, code: -1, message: msg ?? 'Internal Server Error', data });
  59. }
  60. res.sendSuccess = (data, msg) => {
  61. const response = { statusCode: 200, code: 0, message: msg ?? 'OK' }
  62. if (data) {
  63. response.data = data;
  64. }
  65. return res.status(200).json(response);
  66. }
  67. res.sendError = (err) => {
  68. if (err.cause == 400) {
  69. return res.badRequest(err.data, err.message);
  70. }
  71. else if (err.cause == 401) {
  72. return res.unauthorized(err.data, err.message);
  73. }
  74. else if (err.cause == 404) {
  75. return res.notFound(err.data, err.message);
  76. }
  77. else if (err.response) {
  78. return res.serverError(err.response.data, err.response.statusText);
  79. }
  80. return res.serverError(err.data, err.message);
  81. }
  82. next();
  83. });
  84. app.use('/api/auth', authRoutes);
  85. app.use('/api/games', requireAuth, gamesRoutes);
  86. app.use('/api/locales', requireAuth, localesRoutes);
  87. app.use('/api/platforms', requireInternalToken, platformsRoutes);
  88. // 启动服务
  89. const PORT = process.env.PORT || 9020;
  90. mongoose.connect(process.env.MONGO_URI)
  91. .then(() => {
  92. Logs.out('MongoDB connected');
  93. app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
  94. })
  95. .catch(Logs.err);