파일 구성은 아래와 같다
lib/db가 데이터베이스 연결, 이외에 redis와 express-session도 연결할 예정이다
1. lib/db
mysql2 라이브러리를 설치해야한다.
mysql 기본 포트는 3306이다
npm install mysql2
var mysql = require('mysql2');
var db = mysql.createConnection({
host: '',
user: '',
password: '',
database: '',
port: 3306
});
db.connect(function(err) {
if (err) {
console.error('데이터베이스 연결 오류:', err.stack);
return;
}
console.log('데이터베이스에 연결되었습니다. 연결 ID:', db.threadId);
});
module.exports = db;
2. lib/express-session
express-session 라이브러리를 설치해야된다
npm install express-session
var options = {
host: '',
user: '',
password: '',
database: '',
port: 3306,
clearExpired : true , // 만료된 세션 자동 확인 및 지우기 여부
checkExpirationInterval: 10000, // 만료된 세션이 지워지는 빈도 (milliseconds)
expiration: 1000*60*60*2, // 유효한 세션의 최대 기간 2시간으로 설정 (milliseconds)
};
module.exports = options;
3. lib/redis
redis 라이브러리를 설치해야된다.
redis 기본 포트는 6379이다
npm install redis
var redis = require('redis');
var redisClient = redis.createClient({
url: `redis://:비번@연결서버IP:6379`,
legacyMode: true, // 반드시 설정 !!
});
redisClient.on('connect', () => {
console.info('Redis connected!');
});
redisClient.on('error', (err) => {
console.error('Redis Client Error', err);
});
redisClient.connect().then(); // redis v4 연결 (비동기)
var redisCli = redisClient.v4;
module.exports = redisCli;
4. server.js
const express = require('express');
const session = require('express-session');
const path = require('path');
const cors = require('cors');
const sessionOption = require('./lib/sessionOption');
const bodyParser = require("body-parser");
var http = require('http');
require('dotenv').config();
const corsOptions = {
origin: process.env.FRONT_URL,
methods: ['GET', 'POST', 'OPTIONS', 'DELETE', 'PUT'],
allowedHeaders: ['Authorization', 'Content-Type'],
credentials: true,
optionsSuccessStatus: 200
};
const app = express();
const port = 3001;
// 정적 파일 제공 (React 앱)
app.use(express.static(path.join(__dirname, '/build')));
// 미들웨어
app.use(bodyParser.json({ limit: '100mb' }));
app.use(bodyParser.urlencoded({ extended: true, limit: '100mb' }));
app.use(cors(corsOptions));
app.options('*', cors(corsOptions));
// 세션 설정
const MySQLStore = require('express-mysql-session')(session);
const sessionStore = new MySQLStore(sessionOption);
app.use(session({
secure: false,
key: '쿠키 이름',
secret: '',
store: sessionStore,
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 1000*60*60*2,
secure: false,
httpOnly: true,
sameSite: 'lax',
}
}));
app.get('/', (req, res) => {
res.redirect(process.env.FRONT_URL);
});
// 기본 경로로 정적 파일 제공 (React 앱)
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, '/build/index.html'));
});
var appServer = http.createServer(app);
appServer.listen(port,() => {
console.log(`Example app listening at http://localhost:${port}`);
});
위 4번 코드에 대해 설명하자면
app.use(bodyParser.json({ limit: '100mb' }));
app.use(bodyParser.urlencoded({ extended: true, limit: '100mb' }));
app.use(cors(corsOptions));
app.options('*', cors(corsOptions));
리액트와의 연동을 위해 cors 정책에 대해 설정한 것이다.
const corsOptions = {
origin: process.env.FRONT_URL,
methods: ['GET', 'POST', 'OPTIONS', 'DELETE', 'PUT'],
allowedHeaders: ['Authorization', 'Content-Type'],
credentials: true,
optionsSuccessStatus: 200
};
express-session을 사용하려면 credentials을 허용해야한다.
리눅스 배포 시 cors정책에 대한 추가적인 설정을 해야하는데, 따로 게시물을 정리해 올릴 생각이다.
참고 URL : https://sirius7.tistory.com/101
'Web > Node.js & Nest.js' 카테고리의 다른 글
createConnection이 8시간마다 끊기는 문제 (0) | 2024.09.17 |
---|---|
[Node]Like문 쿼리 조회하기 (0) | 2024.09.15 |
Node 실행 시 "버전 `CXXABI_1.3.8'을 찾을 수 없습니다." 발생 (0) | 2024.09.15 |
node.js 개념 이해하기 (0) | 2022.06.05 |
node.js 소캣을 이용한 채팅 (0) | 2021.11.06 |