File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
/**
* @author : 최정우
* @since : 2022.09.20
* @dscription : Express 라이브러리 활용 HTTP Web Server 모듈입니다.
*/
const fs = require('fs');
const { BASE_DIR, PORT, API_SERVER_HOST } = require('../../../Global');
const JsxToJsBuild = require('./build/JsxToJsBuild');//JSX파일을 JS파일로 Build 해주는 모듈
const Logger = require('../log/Logger');//Logger(필수)
const http = require('http');
const https = require('https');
const express = require('express');
const webServer = express();
const expressProxy = require('express-http-proxy');
http.createServer(webServer).listen(PORT);
https.createServer({
/* key: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.com/u-dolbom.com_nopass.key`),
cert: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.com/u-dolbom.com.pem`),
ca: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.com/Chain_RootCA_Bundle.crt`), */
key: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.co.kr/u-dolbom.co.kr_nopass.key`),
cert: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.co.kr/u-dolbom.co.kr.pem`),
ca: fs.readFileSync(`${BASE_DIR}/server/modules/web/ssl/u-dolbom.co.kr/Chain_RootCA_Bundle.crt`),
/* requestCert: false,
rejectUnauthorized: false */
}, webServer).listen(443);
/**
* @author : 최정우
* @since : 2022.09.20
* @dscription : HTTP Server start
*/
/* webServer.listen(443, function () {
Logger.logging(`★★★ Node.js를 활용한 Web Server 구동(Port:${443}) ★★★`);
}) */
/**
* @author : 최정우
* @since : 2022.09.20
* @dscription : Intercepter 역할을 하는 미들웨어 기능
*/
webServer.use(function (request, response, next) {
let ip = request.headers['x-forwarded-for'] || request.socket.remoteAddress;
Logger.logging(`[HTTP] ${request.url} (Method: ${request.method}, IP: ${ip})`);
next();
});
/**
* @author : 최정우
* @since : 2022.09.20
* @dscription : ROOT URL -> index.html
*/
webServer.get('/', function (request, response) {
response.sendFile(`${BASE_DIR}/client/views/index.html`);
})
/**
* @author : 최정우
* @since : 2022.09.20
* @dscription : Router's (Controller)
*/
webServer.use("/test", require('../../service/test/router/TestRouter'));
/**
* webpack 환경에서는 필요 없음
* @author : 최정우
* @since : 2022.09.20
* @dscription : Babel을 활용하여 jsx구문을 js구문으로 바꿔 주는 기능
//webServer.get('*.(jsx|js)', function(request, response, next) {
webServer.get('*.jsx', function(request, response, next) {
//JSX파일을 JS파일로 Build하는 function 호출 (return Promise)
const JsxFileBuildResult = JsxToJsBuild.buildCache(`${BASE_DIR + request.url}`);
JsxFileBuildResult.then(function (jsContent, jsxConent) {
//jsContent는 Text(String)이기 때문에, 그대로 보내면 MIME type이 text/plan으로 전송됨
//그래서 MIME type을 text/javascript로 바꿔야함
//동일한 코드1 : response.contentType('text/javascript');
//동일한 코드2 : response.setHeader('Content-Type', 'text/javascript');
response.type('.js');//동일한 코드3
//응답
response.send(jsContent);
}).catch(function (error) {
next(error);//Global Error Handler에게 예외상황 맡기기
})
})
*/
/**
* @author : 최정우
* @since : 2022.09.20
* @dscription : 화면요청 URL 처리
*/
webServer.get('*.page', function (request, response, next) {
//기능구현예정
})
/**
* @author : 최정우
* @since : 2022.09.20
* @dscription : ROOT URL, Router's, 화면요청 URL 등.. 이 외 나머지 정적 자원에 대한 처리 기능
*/
webServer.get('*.*', function (request, response, next) {
response.sendFile(`${BASE_DIR}${request.params['0']}.${request.params['1']}`);
})
/**
* @author : 류윤주
* @since : 2022.11.06
* @dscription : React Router처리
*/
webServer.get('*', function (request, response, next) {
response.sendFile(`${BASE_DIR}/client/views/index.html`);
})
/**
+ * @author : 방선주
+ * @since : 2023.02.14
+ * @dscription : REST API 서버에 데이터 요청 보내기(Proxy)
+ */
webServer.use('*.json', expressProxy(API_SERVER_HOST, {
proxyReqPathResolver: function (request) {
//console.log('API_SERVER_HOST : ', API_SERVER_HOST);
//console.log('request : ', request.url, `${request.params['0']}.json`);
return `${request.params['0']}.json`;
}
}));
/**
* @author : 최정우
* @since : 2023.03.18
* @dscription : REST API 서버에 File 요청 보내기(Proxy)
* express-http-proxy 라이브러리에서 Request Body 구문해석을 못하도록 강제로 막음 (parseReqBody: false)
* => 이유 : 구문해석 후, express-http-proxy가 Body의 내용을 변형시키는 듯 함.
* 그래서, API 서버에 제대로된 Body를 전달하지 못 함
*/
webServer.use('*.file', expressProxy(API_SERVER_HOST, {
parseReqBody: false,
proxyReqPathResolver: function (request) {
console.log('request : ', request.url, request.params[0]);
return `${request.params['0']}.file`;
}
}));
/**
* @author : 최정우
* @since : 2022.09.21
* @dscription : Global Error Handler (*맨 마지막에 적용해야됨)
*/
webServer.use(function (error, request, response, next) {
const errorCode = !error.statusCode ? 500 : error.statusCode;
response.status(errorCode).send('에러가 발생하였습니다. 관리자에게 문의바랍니다.');
let message = `[Error:${errorCode}] ${request.url}\n ${error.stack}\n`;
Logger.logging(message);
//next();
})