Xóa scene con mà không xóa scene cha
This commit is contained in:
+44
-10
@@ -1,3 +1,4 @@
|
||||
require('dotenv').config();
|
||||
const express = require('express');
|
||||
const cors = require('cors');
|
||||
const path = require('path');
|
||||
@@ -15,26 +16,49 @@ connectDB();
|
||||
const app = express();
|
||||
|
||||
// Standard middlewares
|
||||
// Chuẩn bị danh sách các origin được phép cho CORS
|
||||
const primarySystemHost = process.env.SYSTEM_HOST || 'http://localhost:5000';
|
||||
let configuredAllowedOrigins = [];
|
||||
|
||||
// Thêm SYSTEM_HOST chính
|
||||
try {
|
||||
configuredAllowedOrigins.push(new URL(primarySystemHost).origin);
|
||||
} catch (e) {
|
||||
console.warn(`[CORS Config Warning] Malformed SYSTEM_HOST: ${primarySystemHost}. Using as-is.`);
|
||||
configuredAllowedOrigins.push(primarySystemHost);
|
||||
}
|
||||
|
||||
// Thêm các origin bổ sung từ biến môi trường ADDITIONAL_ALLOWED_ORIGINS (cách nhau bởi dấu phẩy)
|
||||
if (process.env.ADDITIONAL_ALLOWED_ORIGINS) {
|
||||
process.env.ADDITIONAL_ALLOWED_ORIGINS.split(',').forEach(originStr => {
|
||||
try {
|
||||
configuredAllowedOrigins.push(new URL(originStr.trim()).origin);
|
||||
} catch (e) {
|
||||
console.warn(`[CORS Config Warning] Malformed origin in ADDITIONAL_ALLOWED_ORIGINS: ${originStr.trim()}. Skipping.`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const corsOptions = {
|
||||
origin: function (origin, callback) {
|
||||
// Cho phép các request không có origin (như Postman hoặc khi render phía server)
|
||||
if (!origin) return callback(null, true);
|
||||
|
||||
const systemHost = process.env.SYSTEM_HOST || 'http://localhost:5000';
|
||||
let allowedOrigin;
|
||||
|
||||
let incomingOrigin;
|
||||
try {
|
||||
allowedOrigin = new URL(systemHost).origin;
|
||||
incomingOrigin = new URL(origin).origin;
|
||||
} catch (e) {
|
||||
allowedOrigin = systemHost;
|
||||
incomingOrigin = origin;
|
||||
}
|
||||
|
||||
// Trong môi trường dev, cho phép localhost với bất kỳ port nào
|
||||
const isLocal = origin.includes('localhost') || origin.includes('127.0.0.1') || origin.includes('::1');
|
||||
// Kiểm tra nếu incomingOrigin nằm trong danh sách các origin được cấu hình
|
||||
if (configuredAllowedOrigins.includes(incomingOrigin)) return callback(null, true);
|
||||
|
||||
// Trong môi trường dev, cho phép các biến thể localhost
|
||||
const isLocal = incomingOrigin.includes('localhost') || incomingOrigin.includes('127.0.0.1') || incomingOrigin.includes('::1');
|
||||
if (process.env.NODE_ENV !== 'production' && isLocal) {
|
||||
return callback(null, true);
|
||||
}
|
||||
|
||||
if (origin === allowedOrigin) return callback(null, true);
|
||||
|
||||
console.warn(`[CORS Blocked]: Origin ${origin} is not allowed by configuration.`);
|
||||
callback(new Error('Not allowed by CORS'));
|
||||
@@ -68,9 +92,19 @@ app.use((req, res) => {
|
||||
res.sendFile(path.join(__dirname, '../frontend/index.html'));
|
||||
});
|
||||
|
||||
// Centralized JSON Error Handler (Ngăn chặn lỗi trả về HTML làm hỏng Frontend)
|
||||
app.use((err, req, res, next) => {
|
||||
console.error(`[Error Handler]: ${err.message}`);
|
||||
res.status(err.status || 500).json({
|
||||
message: err.message || 'Internal Server Error'
|
||||
});
|
||||
});
|
||||
|
||||
const PORT = process.env.PORT || 5000;
|
||||
|
||||
app.listen(PORT, () => {
|
||||
console.log(`Server is running in ${process.env.NODE_ENV || 'development'} mode on port ${PORT}`);
|
||||
console.log(`System Host (Referer origin check) set to: ${process.env.SYSTEM_HOST || 'http://localhost:5000'}`);
|
||||
console.log(`CORS Allowed Origins: ${configuredAllowedOrigins.join(', ')}`);
|
||||
});
|
||||
// ... cuối file server.js
|
||||
module.exports = app;
|
||||
Reference in New Issue
Block a user