๐ ๋ฌธ์ 1 :
์ด๋ฒ์ ์๋ฒ ํ์ผ์ ์์ ํ๋ค๋ณด๋ GET์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด /Dashboard๋ก GET์์ฒญ์ ๋ณด๋ด๋๋ก ๋์ด ์๋๋ฐ ์ ์๋๋์ง ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํด๋ณด์...ํ....
๋จผ์ , ์๋๋ ํด๋ผ์ด์ธํธ์ธก์ get์์ฒญ ์ง์ ์ ์ด๋ค.
const handleLogin = (event) => {
event.preventDefault();
toast.info('Navigating to VT CAS login page...');
const casLoginUrl = 'https://login.vt.edu/profile/cas/login?service=https://crescendo.cs.vt.edu:8080/Dashboard';
window.location.href = casLoginUrl;
};
๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด /Dashboard๋ก ๋ผ์ฐํ ๋๋ค.
๋ค์์ ์๋ฒ์ธก ๋ผ์ฐํ ์ค์ ์ ํ์ธ ํด๋ณด์.
app.use('/auth', require('./routes/authRoutes'));
์ด ๋ผ์ธ์ '/auth' ๊ฒฝ๋ก๋ก ์์ํ๋ ๋ชจ๋ ์์ฒญ์ authRoutes ํ์ผ๋ก ๋ผ์ฐํ ํ๋ค.
์ด ๊ทผ๋ฐ... ์ง๊ธ ๋ค์๋ณด๋ ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ /Dashboard ๋ผ๊ณ ๋ง ๋ณด๋ด๊ณ ์์๋ค. ๋ฐฉ๊ธ ๋งํ๊ฒ ์ฒ๋ผ ๊ฒฝ๋ก๋ฅผ ์๋ชป ์ค์ ํด ๋ฐ์ํ ์ผ์ด๋ค. ์ด๋ ๊ฒ ๊ณ ์น๋ ์ ๋๋ก ์์ฒญ์ด ๋ค์ด์๋ค.
๐ ๋ฌธ์ 2:
์ฝ์ค๋ฅผ ์์ฑํ๋ ค๊ณ ํ๋ฉด ์ฝ์ค๋ฅผ ์์ฑ ํ ์ ์๋ค๊ณ ๋ธ... ์ด๊ฒ๋ 99% ๊ฒฝ๋ก ๋ฌธ์ ๋ผ๊ณ ํ์ ํ๋ค. ์ผ๋จ ๋ณด์....
๋จผ์ , ์๋ฒ ํ์ผ์ ํ์ธํด ๋ผ์ฐํ ์ค์ ์ ํ์ธ ํด์ค๋ค.
app.use('/courses', require('./routes/courseRoutes'));
์ด ๋ผ์ธ์ '/courses' ๊ฒฝ๋ก๋ก ์์ํ๋ ๋ชจ๋ ์์ฒญ์ courseRoutes ํ์ผ๋ก ๋ผ์ฐํ ํ๋ค.
์ด์ , courseRoutes๋ฅผ ํ์ธ ํด๋ณด์.
const express = require('express');
const router = express.Router();
const courseController = require('../controllers/courseController');
router.post('/create', courseController.createCourse);
router.post('/register', courseController.registerCourse);
router.get('/', courseController.getCourses);
router.get('/:courseId', courseController.getCourse);
router.put('/:courseId', courseController.updateCourse);
router.delete('/:courseId', courseController.deleteCourse);
module.exports = router;
๋ผ์ฐํฐ ์ค์
-express.Router()๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ฐํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
-courseController์์ ๊ฐ ์ปจํธ๋กค๋ฌ ํจ์๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ค.
๋ผ์ฐํฐ ์๋ํฌ์ธํธ
router.post('/create', courseController.createCourse): ๊ฐ์ข ์์ฑ ์๋ํฌ์ธํธ. POST /create ์์ฒญ์ ๋ฐ์ ์๋ก์ด ๊ฐ์ข๋ฅผ ์์ฑํ๋ค.
router.post('/register', courseController.registerCourse): ๊ฐ์ข ๋ฑ๋ก ์๋ํฌ์ธํธ. POST /register ์์ฒญ์ ๋ฐ์ ์ฌ์ฉ์๋ฅผ ๊ฐ์ข์ ๋ฑ๋กํ๋ค.
router.get('/', courseController.getCourses): ๊ฐ์ข ๋ชฉ๋ก ์กฐํ ์๋ํฌ์ธํธ. GET / ์์ฒญ์ ๋ฐ์ ๋ชจ๋ ๊ฐ์ข๋ฅผ ๋ฐํํ๋ค.
router.get('/:courseId', courseController.getCourse): ํน์ ๊ฐ์ข ์กฐํ ์๋ํฌ์ธํธ. GET /:courseId ์์ฒญ์ ๋ฐ์ ํน์ ID์ ๊ฐ์ข๋ฅผ ๋ฐํํ๋ค.
router.put('/:courseId', courseController.updateCourse): ๊ฐ์ข ์
๋ฐ์ดํธ ์๋ํฌ์ธํธ. PUT /:courseId ์์ฒญ์ ๋ฐ์ ํน์ ID์ ๊ฐ์ข ์ ๋ณด๋ฅผ ์
๋ฐ์ดํธํ๋ค.
router.delete('/:courseId', courseController.deleteCourse): ๊ฐ์ข ์ญ์ ์๋ํฌ์ธํธ. DELETE /:courseId ์์ฒญ์ ๋ฐ์ ํน์ ID์ ๊ฐ์ข๋ฅผ ์ญ์ ํ๋ค.
๋ชจ๋ ์ ๋๋ก ๋์ด ์๋๊ฒ ๊ฐ์ผ๋ ์์ฒญ์ ๋ณด๋ด๋ ํด๋ผ์ด์ธํธ์ชฝ ์ฝ๋๋ฅผ ๋ณด์.
const handleCreateCourse = async () => {
try {
const response = await axios.post('https://crescendo.cs.vt.edu:8080/createCourse', {
name: courseName,
term: term,
crn: crn
}, {
withCredentials: true,
headers: {
'Content-Type': 'application/json'
}
});
if (response.status === 201) {
toast.success('Course created successfully!');
setCourses([...courses, response.data]);
setShowModal(false);
setCourseName('');
setTerm('');
setCrn('');
setSelectedCourseId(null);
}
} catch (error) {
toast.error('Failed to create course');
console.error('Error creating course:', error);
}
};
์ญ์๋! ์์ฒญ ๊ฒฝ๋ก๊ฐ ์๋ชป๋์ด ์ ๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
https://crescendo.cs.vt.edu:8080/courses/create ์ ๊ฒฝ๋ก๋ก ์์ฒญ์ ๋ณด๋ด์ผ ์ ๋๋ก ๋ ์์ฒญ์ ๋ฐ๊ณ ์ฒ๋ฆฌ ํ ์ ์๋ค.
๐ ๋ฌธ์ 3: ์ฝ์ค ์ญ์ ๋ถ๊ฐ
์์ฑ๋ Course๋ฅผ ์ญ์ ํ๋ ค๊ณ ํ๋ ์๊พธ 404 ์๋ฌ๊ฐ ๋ฐ์. ์ด๊ฑด ํ์ธํด๋ณด๋ ๊ฒฝ๋ก ๋ฌธ์ ๋ ์๋์๋ค.
๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์๋ค : ์ปจํธ๋กค๋ฌ์์๋ req.params.id๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง, ๋ผ์ฐํธ์์๋ :courseId๋ก ์ ์๋์ด ์๋ค. ์ด๋ฅผ ์ผ์น์์ผ์ผ ํ๋ค.
์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด...
Express.js์์ ๋ผ์ฐํธ๋ฅผ ์ ์ํ ๋, URL ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด ํ๋ผ๋ฏธํฐ๋ ์ฝ๋ก (:)์ ์ฌ์ฉํ์ฌ ์ ์ํ๋ฉฐ, ์ด๋ฅผ ํตํด ๋์ ์ผ๋ก ๊ฐ์ ๋ฐ์ ์ ์๋ค.
์ด์ ์ฝ๋์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ผ์ฐํธ๊ฐ ์ ์๋์ด ์์๋ค:
router.delete('/:courseId', courseController.deleteCourse);
์ฌ๊ธฐ์ :courseId๋ URL ํ๋ผ๋ฏธํฐ๋ค. ์๋ฅผ ๋ค์ด, /courses/123์ด๋ผ๋ ์์ฒญ์ด ์ค๋ฉด, 123์ด courseId ํ๋ผ๋ฏธํฐ์ ๊ฐ์ด๋ค.
๊ทธ๋ฌ๋ ์ปจํธ๋กค๋ฌ ํจ์์์๋ ์ด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ทผํ๊ณ ์๋ค:
const courseId = req.params.id;
์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋ผ์ฐํธ์์๋ :courseId๋ก ์ ์ํ์ง๋ง, ์ปจํธ๋กค๋ฌ์์๋ id๋ก ์ ๊ทผํ๊ณ ์์ด ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค:
๋ผ์ฐํธ ์ ์๋ฅผ ์ปจํธ๋กค๋ฌ์ ์ผ์น์ํค๊ธฐ:
router.delete('/:id', courseController.deleteCourse);
์ปจํธ๋กค๋ฌ์์ ํ๋ผ๋ฏธํฐ ์ ๊ทผ ๋ฐฉ์์ ๋ผ์ฐํธ์ ์ผ์น์ํค๊ธฐ:
const courseId = req.params.courseId;
๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ ํํ์ฌ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ์ผ์น์ํค๋ฉด, ์๋ฒ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ course ID๋ฅผ ๋ฐ์ ์ญ์ ์์
์ ์ํํ ์ ์๋ค.
์ด ๋ถ์ผ์น๋ก ์ธํด courseId๊ฐ undefined๊ฐ ๋์ด course๋ฅผ ์ฐพ์ง ๋ชปํ๊ฑฐ๋ ์ญ์ ํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
'Undergrad Research' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Database] ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์ค๊ณ, CRUD ์ฐ์ฐ (0) | 2024.07.27 |
---|---|
[TroubleShooting] mongoDB ์คํํ๊ธฐ (1) | 2024.07.26 |
[React, TroubleShooting] ThemeProvider์ ๋ฌด์์ผ๊น? (0) | 2024.07.16 |
์ ์ ์ ๋ณด parsing (0) | 2024.07.03 |
[Backend]์ ์ ๋ชจ๋ธ ๊ด๋ฆฌํ๊ธฐ (0) | 2024.06.29 |