๐ํค์๋: npm ํจํค์ง, ์ปจํธ๋กค๋ฌ, ๊ด๊ณ, Passport ๋ชจ๋, multer ํจํค์ง
npm init
npm i sequelize mysql2 sequelize-cli
npx sepuelize init
exports.renderProfile = (req, res) => {
res.render('profile', { title: '๋ด ์ ๋ณด - NodeBird' });
};
exports.renderJoin = (req, res) => {
res.render('join', { title: 'ํ์๊ฐ์
- NodeBird' });
};
exports.renderMain = (req, res, next) => {
const twits = [];
res.render('main', {
title: 'NodeBird',
twits,
});
};
โ 1:N ๊ด๊ณ
User ๋ชจ๋ธ๊ณผ Post ๋ชจ๋ธ์ 1(User):N(Post) ๊ด๊ณ์ ์์ผ๋ฏ๋ก hasMany๋ก ์ฐ๊ฒฐ๋์ด ์์
static associate(db) {
db.User.hasMany(db.Post);
db.User.belongsToMany(db.User, {
foreignKey: 'followingId',
as: 'Followers',
through: 'Follow',
});
db.User.belongsToMany(db.User, {
foreignKey: 'followerId',
as: 'Follwings',
through: 'Follow',
});
}
โก N:M ๊ด๊ณ
const passport = require('passport');
const local = require('./localStrategy');
const kakao = require('./kakaoStrategy');
const User = require('../models/user');
module.exports = () => {
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findOne({ where: { id } })
.then(user => done(null, user))
.catch(err => done(err));
});
local();
kakao();
};
โ
์์ ์ฝ๋
// POST /post/img
router.post('/img', isLoggedIn, upload.single('img'), afterUploadImage);
// POST /post
const upload2 = multer();
router.post('/', isLoggedIn, upload2.none(), uploadPost);
module.exports = router;
โ
โ
โ
โ
1. ๋ผ์ฐํฐ ๋ง์ง๋ง์ ์์นํด ํด๋ผ์ด์ธํธ์ ์๋ต์ ๋ณด๋ด๋ ๋ฏธ๋ค์จ์ด๋ฅผ ( ) ๋ผ๊ณ ํ๋ค.
โ
2. User ๋ชจ๋ธ๊ณผ Post ๋ชจ๋ธ์ ( ) ๊ด๊ณ์ ์๊ณ , ํ๋ก์ ๊ธฐ๋ฅ์ ( ) ๊ด๊ณ์ ์๋ค.
โ
3. ํ์ ๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ์ ๊ตฌํํ ๋ ์ฌ์ฉํ๋ ๋ชจ๋์ ( ) ๋ชจ๋์ด๋ค.
โ
4. ( ) ํจํค์ง๋ ์ด๋ฏธ์ง๋ฅผ ์๋ฒ ๋์คํฌ์ ์ ์ฅํ๋ค.
โ
5. ์๋ฒ๋ ์์ฒญ์ ๋ฐ๋์ ์๋ตํด์ผํ๋ฉฐ, ์ฌ๋ฌ ๋ฒ ์๋ตํ ์ ์๋ค. [ O/X ]
โ
6. ( ) ํจํค์ง์ ( ) ํ์ผ๋ก ์ ์ถ๋๋ฉด ์ ๋๋ ๋น๋ฐ ํค๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค.
โ
7. ๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ผ์ฐํฐ๋ ( ) ํด๋์, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ( ) ํด๋์, html ํ์ผ์ ( ) ํด๋์ ๊ตฌ๋ถํด์ ์ ์ฅํ๋ค.
โ
โ
โ
8. Node.js์ Express๋ฅผ ์ฌ์ฉํ์ฌ POST /post/img ๋ผ์ฐํฐ๋ฅผ ๊ตฌํํ๋ ์ฝ๋๋ฅผ ์์ฑํ์์ค. (์ด ๋ผ์ฐํฐ๋ ์ฌ์ฉ์๊ฐ ์ ๋ก๋ํ ๋จ์ผ ์ด๋ฏธ์ง๋ฅผ ์๋ฒ์์ ์ฒ๋ฆฌํ๊ณ , ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ง ๊ธฐ๋ฅ์ ๊ธฐ์ฉํ ์ ์๋ค.)
9. GET /profile ์์ฒญ์ด ๋ค์ด์ค๋ฉด 'profile' ํ ํ๋ฆฟ์ ๋ ๋๋งํ๊ณ , title๋ก '๋ด ์ ๋ณด - NodeBird'๋ฅผ ์ ๋ฌํ๋ ์ปจํธ๋กค๋ฌ ํจ์๋ฅผ ์์ฑํ์์ค.
1. ์ปจํธ๋กค๋ฌ
2. 1:N / N:M
3. Passport
4. multer
5. X, ์ฌ๋ฌ ๋ฒ ์๋ตํ๋ฉด ์๋ฌ ๋ฐ์
6. dotenv / .env
7. routes / modules / views
8.
router.post('/img', isLoggedIn, upload.single('img'), afterUploadImage);
9.
exports.renderProfile = (req, res) => {
res.render('profile', { title: '๋ด ์ ๋ณด - NodeBird' });
};
์ถ์ฒ) ์กฐํ์ , ใNode.js ๊ต๊ณผ์ ๊ฐ์ 3ํใ, ๊ธธ๋ฒ(2022), 9์ฅ
Corner node.js 2ํ
Editor : Pujimbao
[๋ ธ๋ 2ํ] #12. ์น ์์ผ์ผ๋ก ์ค์๊ฐ ๋ฐ์ดํฐ ์ ์กํ๊ธฐ (0) | 2025.01.17 |
---|---|
[๋ ธ๋ 2ํ] #11. ์น API ์๋ฒ ๋ง๋ค๊ธฐ (1) | 2025.01.10 |
[๋ ธ๋ 2ํ] #9. ๋ชฝ๊ณ ๋๋น (3) | 2024.12.27 |
[๋ ธ๋ 2ํ] #8. MySQL (3) | 2024.11.29 |
[๋ ธ๋ 2ํ] #7. ์ต์คํ๋ ์ค ์น ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2024.11.22 |