Undergrad Research
mongoDB 서버와 통신 불가능한 상황...
Jay_J
2024. 5. 24. 10:40
일단 내가 만든 애플리케이션은 우리 학교 서버에 호스팅이 되어있다. 하지만 지금 살짝 어려움을 겪고있다.
1. 프로토콜을 HTTPS로 변경하기(학교측 미들웨어 서비스 센터에서 cert 발급을 기다리는 중이다.)
2. 피드백을 보내고 받는 통신이 되었지만 여러 부분을 고치고 난 후 모종의 이유로 피드백을 보내고 받는 기능이 안 된다.
그래서 오랜만에 다시 백엔드 파일을 다시 살펴보도록 하자
require('dotenv').config();
const express = require('express');
const session = require('express-session');
const CASAuthentication = require('cas-authentication');
const cors = require('cors');
const mongoose = require('mongoose');
const app = express();
app.use(cors());
app.use(express.json());
app.use(session({
secret: 'your_secret_key',
resave: false,
saveUninitialized: true
}));
const cas = new CASAuthentication({
cas_url: 'https://login.vt.edu/profile/cas',
service_url: 'http://cs.vt.edu:8080', // 서비스 URL
cas_version: '2.0',
renew: false,
is_dev_mode: false
});
app.use(cas.bounce);
const PORT = process.env.PORT || 8080;
const schemaData = mongoose.Schema({
title: String,
message: String,
}, {
timestamps: true
});
const feedbackModel = mongoose.model("feedbacks", schemaData);
console.log('MongoDB URI:', process.env.MONGO_URI);
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => {
console.log("Connected to db")
app.listen(PORT, '0.0.0.0', () => {
console.log(`Server is running on port ${PORT}`);
});
})
.catch((err) => console.log(err))
app.post("/saveFeedback", async (req, res) => {
try {
console.log(req.body);
if (!req.body.title || !req.body.message) {
return res.status(400).json({ success: false, message: "Title and message are required fields" });
}
const data = new feedbackModel(req.body);
await data.save();
res.status(200).json({ success: true, message: "Data save successful" });
} catch (error) {
console.error(error);
res.status(500).json({ success: false, message: "Internal server error" });
}
});
app.get("/getFeedback", async (req, res) => {
try {
const data = await feedbackModel.find({}, { title: 1, message: 1 });
res.status(200).json(data);
} catch (error) {
console.error(error);
res.status(500).json({ success: false, message: "Internal server error" });
}
});
애플리케이션 개발 초기 단계에 작성한 백엔드 파일이다. 아직 수정해야 할 부분도 많고 손 봐야 할 부분도 많다. 일단 1차원적으로 왜 통신안 되는지 살펴보자.
먼저, 여기서 Submit 버튼을 누르면 피드백이 서버로 보내지도록 되어있다. 하지만 현재 Submit버튼을 누르면, 아래와 같은 화면이 나온다....
일단 여기에는 몇가지 이유가 있을 수 있다. 하지만... 오늘은 다시 예전 내용을 복습하는 차원에서 코드를 하나하나 살펴보자
1. 필요한 모듈 불러오기.
require('dotenv').config();
const express = require('express');
const session = require('express-session');
const CASAuthentication = require('cas-authentication');
const cors = require('cors');
const mongoose = require('mongoose');
const app = express();
app.use(cors());
app.use(express.json());
- require('dotenv').config(); : 이 라인은 .env 파일에 정의된 환경 변수를 로드하여 process.env 객체에 추가한다. 이렇게 하지 않으면 매번 환경변수를 export를 통해 일일히 설정해줘야한다.
- const express = require('express'); : Express는 Node.js를 위한 웹 프레임워크로, 서버를 쉽게 구축할 수 있도록 도와준다. express 모듈을 불러온다.
- const session = require('express-session'); : 세션 관리를 위한 미들웨어로, 사용자의 세션을 관리할 수 있다.
- const cors = require('cors'); : CORS(Cross-Origin Resource Sharing)를 설정하기 위한 미들웨어로, 다른 출처의 리소스에 대한 접근을 허용할 수 있다.
- const mongoose = require('mongoose'); : MongoDB와 연결하고 상호작용하기 위한 ODM(Object Data Modeling) 라이브러리이다.
2. 앱 설정
const PORT = process.env.PORT || 8080;
const schemaData = mongoose.Schema({
title: String,
message: String,
}, {
timestamps: true
});
const feedbackModel = mongoose.model("feedbacks", schemaData);
- const PORT = process.env.PORT || 8080; : 서버가 실행될 포트를 설정한다. 환경 변수에 포트가 정의되어 있지 않으면 8080 포트를 사용한다.
- const schemaData = mongoose.Schema({
title: String,
message: String,
}, {
timestamps: true
}); : 피드백 데이터를 저장하기 위한 Mongoose 스키마를 정의한다. title과 message 필드를 포함하며, timestamps 옵션을 통해 생성 시간과 수정 시간을 자동으로 관리한다. - const feedbackModel = mongoose.model("feedbacks", schemaData); : 스키마를 기반으로 Mongoose 모델을 생성한다. 이 모델을 통해 MongoDB 컬렉션과 상호작용할 수 있다.
3. MongoDB와 연결
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => {
console.log("Connected to db")
app.listen(PORT, '0.0.0.0', () => {
console.log(`Server is running on port ${PORT}`);
});
})
.catch((err) => console.log(err));
- 환경 변수에 정의된 MongoDB URI로 MongoDB에 연결한다. 연결이 성공하면 서버를 지정된 포트에서 시작한다. 실패하면 오류를 출력한다.
- 아까 맨 위에서 설정했던 환경변수가 여기서 쓰인다. 확장자가 .env인 파일안에 MONGO_URI환경변수가 정의 되어있다.
- mongoose.connect는 비동기적으로 MongoDB에 연결을 시도한다.
- 여기서 .then은 연결 성공시 실행되는 부분이다. 일단 편의를 위해 콘솔에 connected to db라고 표시를 해주고, 나머지 블록을 실행한다.
- app.listen : Express 애플리케이션을 지정된 포트에서 수신 대기 하도록 한다.
4. 클라이언트로부터 받은 피드백을 저장할 라우트 설정
app.post("/saveFeedback", async (req, res) => {
try {
console.log(req.body);
if (!req.body.title || !req.body.message) {
return res.status(400).json({ success: false, message: "Title and message are required fields" });
}
const data = new feedbackModel(req.body);
await data.save();
res.status(200).json({ success: true, message: "Data save successful" });
} catch (error) {
console.error(error);
res.status(500).json({ success: false, message: "Internal server error" });
}
});
- /saveFeedback 경로에 대한 POST 요청을 처리한다. 요청 본문에서 title과 message를 가져와 피드백 데이터를 저장한다. 필수 필드가 누락된 경우 400 상태 코드를 반환하고, 데이터 저장에 성공하면 200 상태 코드를 반환한다. 오류가 발생하면 500 상태 코드를 반환한다.
4. 피드백 조회 라우트 설정
app.get("/getFeedback", async (req, res) => {
try {
const data = await feedbackModel.find({}, { title: 1, message: 1 });
res.status(200).json(data);
} catch (error) {
console.error(error);
res.status(500).json({ success: false, message: "Internal server error" });
}
});
/getFeedback 경로에 대한 GET 요청을 처리한다. 데이터베이스에서 모든 피드백 데이터를 조회하여 반환한다. 성공하면 200 상태 코드를 반환하고, 오류가 발생하면 500 상태 코드를 반환한다.
일단 여기까지 해 보았는데 전혀 문제되는 부분을 찾지 못했다. 아마 cors 설정이 잘못된거같은데, 어차피 프로토콜도 https를 써야 하니 지금 서버쪽 코드는 건들지 않도록 하겠다... https가 완전히 작동하면 그때 다시 한번 살펴 보도록 하겠다!