http ๋ชจ๋๋ก ์น ์๋ฒ๋ฅผ ๋ง๋ค ๋ ์ฝ๋๊ฐ ๋ณด๊ธฐ ์ข์ง ์๊ณ , ํ์ฅ์ฑ๋ ๋จ์ด์ง
express ์์: app->app๊ด๋ จ ์ค์ ->๊ณตํต ๋ฏธ๋ค์จ์ด -> ๋ผ์ฐํฐ (๋ฒ์ ๋์ ์๋ค์ ๋ค๋ก)-> ์๋ฌ ๋ฏธ๋ค์จ์ด
๐ป tip: - ํ router์ send ๋๋ฒ ์ด์ ๋์ค๋ฉด ์๋ฌ
- res.json(json ์๋ต)์ return์ด ์๋. ๋ฐ์ ์ฝ๋ ์คํ ๊ฐ๋ฅํจ
- res.render(์๋ต์ ๋ณด๋ด๋ ๊ฒ)
- throw new err-> try catch์์ error๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๐next(์๋ฌ์ฒ - ๋ฆฌ ๋ฏธ๋ค์จ์ด๋ก ๋์ด๊ฐ)์ ๋ฃ์ด ์ ์ฒ๋ฆฌ
- next('route')๋ ๋ค์ ๋ผ์ฐํฐ๋ฅผ ์คํ
์ง์ ๋ง๋ค๊ฑฐ๋ npm init ๋ช ๋ น์ด ์์ฑ
{
"name": "chapter6",
"version": "1.0.0",
"description": "์ต์คํ๋ ์ค ๋ฐฐ์ฐ์",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "seokahi",
"license": "MIT",
"devDependencies": {
"nodemon": "^2.0.14"
},
"dependencies": {
"express": "^4.17.1"
}
}
์๋ฒ ๊ตฌ๋์ ํต์ฌ์ด ๋๋ ํ์ผ
๐ปapp.js
const express = require('express');
const path = require('path');
const app = express();
app.set('port', process.env.PORT || 3000);
app.get('/', (req, res) => {
// res.send('Hello, Express');
res.sendFile(path.join(__dirname, '/index.html'));
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค');
});
app.js: ํต์ฌ ์๋ฒ ์คํฌ๋ฆฝํธ
public: ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ ํ์ผ๋ค ๋ชจ์๋
views: ํ ํ๋ฆฟ ํ์ผ์ ๋ชจ์๋
routes: ์๋ฒ์ ๋ผ์ฐํฐ์ ๋ก์ง์ ๋ชจ์๋
- ์ถํ์ models๋ฅผ ๋ง๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ
npm start(package.json์ start ์คํฌ๋ฆฝํธ) ์ฝ์์์ ์คํ
localhost:3000
res.sendFile๋ก HTML ์๋น ๊ฐ๋ฅ
๐ปindex.html
<html>
<head>
<meta charset="UTF-8" />
<title>์ต์คํ๋ ์ค ์๋ฒ</title>
</head>
<body>
<h1>์ต์คํ๋ ์ค</h1>
<p>๋ฐฐ์๋ด
์๋ค.</p>
</body>
</html>
์ต์คํ๋ ์ค๋ ๋ฏธ๋ค์จ์ด๋ก ๊ตฌ์ฑ๋จ
์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์๋ฌ ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด๋ก
...
app.use((err, req, res, next) => {
console.error(err); ๐์๋ฒ์ ์ด๋ค ์๋ฌ์ธ์ง ์๋ ค์ค
res.send('์๋ฌ๋ฌ์ด'); ๐ ์น์ ์ด๋ค ์๋ฌ์ธ์ง ์๋ ค์ฃผ๋ฉด ๋ณด์ ๋ฌธ์ ์๊ธธ์๋ ใ
res.status(500).send(err.message);๐status(500)๋ผ๊ณ ๋ธ๋ผ์ฐ์ ์ ๋ธ(๋ปฅ์น ์๋ o)
});
๐ app.use((err, req, res, next) ๋ฐ๋ก ์์ app.use(req,res,next)=>{res.send('404์ง๋กฑ')} ์ฐ๋ฉด 404 ์๋ฌ์์ ์๋ฏธ
morgan, cookie-parser, express-session ์ค์น
๐ปapp.js<์ด ์ฝ๋>
const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');
dotenv.config();
const app = express();
app.set('port', process.env.PORT || 3000);
app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false,
},
name: 'session-cookie',
}));
const multer = require('multer');
const fs = require('fs');
try {
fs.readdirSync('uploads');
} catch (error) {
console.error('uploads ํด๋๊ฐ ์์ด uploads ํด๋๋ฅผ ์์ฑํฉ๋๋ค.');
fs.mkdirSync('uploads');
}
const upload = multer({
storage: multer.diskStorage({
destination(req, file, done) {
done(null, 'uploads/');
},
filename(req, file, done) {
const ext = path.extname(file.originalname);
done(null, path.basename(file.originalname, ext) + Date.now() + ext);
},
}),
limits: { fileSize: 5 * 1024 * 1024 },
});
app.get('/upload', (req, res) => {
res.sendFile(path.join(__dirname, 'multipart.html'));
});
app.post('/upload', upload.single('image'), (req, res) => {
console.log(req.file);
res.send('ok');
});
app.get('/', (req, res, next) => {
console.log('GET / ์์ฒญ์์๋ง ์คํ๋ฉ๋๋ค.');
next();
}, (req, res) => {
throw new Error('์๋ฌ๋ ์๋ฌ ์ฒ๋ฆฌ ๋ฏธ๋ค์จ์ด๋ก ๊ฐ๋๋ค.')
});
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send(err.message);
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค');
});
.env ํ์ผ์ ์ฝ์ด์ process.env๋ก ๋ง๋ฆ
์๋ฒ๋ก ๋ค์ด์จ ์์ฒญ๊ณผ ์๋ต์ ๊ธฐ๋กํด์ฃผ๋ ๋ฏธ๋ค์จ์ด
์ ์ ์ธ ํ์ผ๋ค์ ์ ๊ณตํ๋ ๋ฏธ๋ค์จ์ด
์ปจํ ์ธ ์์ฒญ ์ฃผ์์ ์ค์ ์ปจํ ์ธ ์ ๊ฒฝ๋ก๋ฅผ ๋ค๋ฅด๊ฒ ๋ง๋ค ์ ์์
์์ฒญ์ ๋ณธ๋ฌธ์ ํด์ํด์ฃผ๋ ๋ฏธ๋ค์จ์ด
์์ฒญ ํค๋์ ์ฟ ํค๋ฅผ ํด์ํด์ฃผ๋ ๋ฏธ๋ค์จ์ด
์ธ์ ๊ด๋ฆฌ์ฉ ๋ฏธ๋ค์จ์ด
req, res, next๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ง๋ ํจ์
์ต์คํ๋ ์ค ๋ฏธ๋ค์จ์ด๋ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ถ์ฝ ๊ฐ๋ฅ
next๋ฅผ ํธ์ถํด์ผ ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ
req๋ res ๊ฐ์ฒด ์์ ๊ฐ์ ๋ฃ์ด ๋ฐ์ดํฐ ์ ๋ฌ ๊ฐ๋ฅ
๋ฏธ๋ค์จ์ด ์์ ๋ฏธ๋ค์จ์ด๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ
form ํ๊ทธ์ enctype์ด multipart/form-data์ธ ๊ฒฝ์ฐ
multer ํจ์๋ฅผ ํธ์ถ
single๊ณผ none, array, fields ๋ฏธ๋ค์จ์ด ์กด์ฌ
app.js๊ฐ ๊ธธ์ด์ง๋ ๊ฒ์ ๋ง์ ์ ์์
userRouter์ get์ /user์ /๊ฐ ํฉ์ณ์ ธ์ GET /user/๊ฐ ๋จ
๐ปroutes/index.js
const express = require('express');
const router = express.Router();
// GET / ๋ผ์ฐํฐ
router.get('/', (req, res) => {
res.send('Hello, Express');
});
module.exports = router;
๐ปroutes/user.js
const express = require('express');
const router = express.Router();
// GET /user ๋ผ์ฐํฐ
router.get('/', (req, res) => {
res.send('Hello, User');
});
module.exports = router;
๐ปapp.js
const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');
dotenv.config();
const indexRouter = require('./routes');
const userRouter = require('./routes/user');
const app = express();
app.set('port', process.env.PORT || 3000);
app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false,
},
name: 'session-cookie',
}));
app.use('/', indexRouter);
app.use('/user', userRouter);
app.use((req, res, next) => {
res.status(404).send('Not Found');
});
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send(err.message);
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค');
});
:id๋ฅผ ๋ฃ์ผ๋ฉด req.params.id๋ก ๋ฐ์ ์ ์์
์์ฒญ๊ณผ ์ผ์นํ๋ ๋ผ์ฐํฐ๊ฐ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด 404 ๋ผ์ฐํฐ๋ฅผ ๋ง๋ค๊ธฐ
์ฃผ์๋ ๊ฐ์ง๋ง ๋ฉ์๋๊ฐ ๋ค๋ฅธ ์ฝ๋๊ฐ ์์ ๋
router.route๋ก ๋ฌถ์
req.app: req ๊ฐ์ฒด๋ฅผ ํตํด app ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์ต๋๋ค. req.app.get('port')์ ๊ฐ์ ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
req.body: body-parser ๋ฏธ๋ค์จ์ด๊ฐ ๋ง๋๋ ์์ฒญ์ ๋ณธ๋ฌธ์ ํด์ํ ๊ฐ์ฒด์ ๋๋ค.
req.cookies: cookie-parser ๋ฏธ๋ค์จ์ด๊ฐ ๋ง๋๋ ์์ฒญ์ ์ฟ ํค๋ฅผ ํด์ํ ๊ฐ์ฒด์ ๋๋ค.
req.ip: ์์ฒญ์ ip ์ฃผ์๊ฐ ๋ด๊ฒจ ์์ต๋๋ค.
req.params: ๋ผ์ฐํธ ๋งค๊ฐ๋ณ์์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ธด ๊ฐ์ฒด์ ๋๋ค.
req.query: ์ฟผ๋ฆฌ์คํธ๋ง์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ธด ๊ฐ์ฒด์ ๋๋ค.
req.signedCookies: ์๋ช ๋ ์ฟ ํค๋ค์ req.cookies ๋์ ์ฌ๊ธฐ์ ๋ด๊ฒจ ์์ต๋๋ค.
req.get(ํค๋ ์ด๋ฆ): ํค๋์ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋์ ๋๋ค![
res.app: req.app์ฒ๋ผ res ๊ฐ์ฒด๋ฅผ ํตํด app ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์ต๋๋ค.
res.cookie(ํค, ๊ฐ, ์ต์ ): ์ฟ ํค๋ฅผ ์ค์ ํ๋ ๋ฉ์๋์ ๋๋ค.
res.clearCookie(ํค, ๊ฐ, ์ต์ ): ์ฟ ํค๋ฅผ ์ ๊ฑฐํ๋ ๋ฉ์๋์ ๋๋ค.
res.end(): ๋ฐ์ดํฐ ์์ด ์๋ต์ ๋ณด๋ ๋๋ค.
res.json(JSON): JSON ํ์์ ์๋ต์ ๋ณด๋ ๋๋ค.
res.redirect(์ฃผ์): ๋ฆฌ๋ค์ด๋ ํธํ ์ฃผ์์ ํจ๊ป ์๋ต์ ๋ณด๋ ๋๋ค.
res.render(๋ทฐ, ๋ฐ์ดํฐ): ๋ค์ ์ ์์ ๋ค๋ฃฐ ํ ํ๋ฆฟ ์์ง์ ๋ ๋๋งํด์ ์๋ตํ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋์ ๋๋ค.
res.send(๋ฐ์ดํฐ): ๋ฐ์ดํฐ์ ํจ๊ป ์๋ต์ ๋ณด๋ ๋๋ค. ๋ฐ์ดํฐ๋ ๋ฌธ์์ด์ผ ์๋ ์๊ณ H TML์ผ ์๋ ์์ผ๋ฉฐ, ๋ฒํผ์ผ ์๋ ์๊ณ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ผ ์๋ ์์ต๋๋ค.
res.sendFile(๊ฒฝ๋ก): ๊ฒฝ๋ก์ ์์นํ ํ์ผ์ ์๋ตํฉ๋๋ค.
res.setHeader(ํค๋, ๊ฐ): ์๋ต์ ํค๋๋ฅผ ์ค์ ํฉ๋๋ค.
res.status(์ฝ๋): ์๋ต ์์ HTTP ์ํ ์ฝ๋๋ฅผ ์ง์ ํฉ๋๋ค.
๋ฉ์๋ ์ฒด์ด๋์ ์ง์ํจ
์๋ต์ ํ ๋ฒ๋ง ๋ณด๋ด์ผ ํจ
HTML์ ์ ์ ์ธ ๋จ์ ์ ๊ฐ์
๋ฌธ๋ฒ์ด Ruby์ ๋น์ทํด ์ฝ๋ ์์ด ๋ง์ด ์ค์ด๋ฆ
const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');
const nunjucks = require('nunjucks');
dotenv.config();
const indexRouter = require('./routes');
const userRouter = require('./routes/user');
const app = express();
app.set('port', process.env.PORT || 3000);
nunjucks.configure('views', {
express: app,
watch: true,
});
app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false,
},
name: 'session-cookie',
}));
app.use('/', indexRouter);
app.use('/user', userRouter);
app.use((req, res, next) => {
res.status(404).send('Not Found');
});
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send(err.message);
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค');
});
res.render์์ ๋ ๋ฒ์งธ ์ธ์ ๊ฐ์ฒด์ Pug ๋ณ์๋ฅผ ๋ฃ์
ํผ๊ทธ ํ์ผ ์์์ ๋ณ์ ์ ์ธ ๊ฐ๋ฅ
for in์ด๋ each in์ผ๋ก ๋ฐ๋ณต๋ฌธ ๋๋ฆด ์ ์์
if else if else๋ฌธ, case when๋ฌธ ์ฌ์ฉ ๊ฐ๋ฅ
ํผ๊ทธ ํ์ผ์ ๋ค๋ฅธ ํผ๊ทธ ํ์ผ์ ๋ฃ์ ์ ์์
๋ ์ด์์์ ์ ํ ์ ์์
Pug์ ๋ฌธ๋ฒ์ ์ ์๋์ง ์๋๋ค๋ฉด ๋์ ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์
{{๋ณ์}}
๋ด๋ถ ๋ณ์ ์ ์ธ ๊ฐ๋ฅ {%set ์๋ฐ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ }
{% %} ์์ for in ์์ฑ(์ธ๋ฑ์ค๋ loop ํค์๋)
{% if %} ์์ ์กฐ๊ฑด๋ฌธ ์์ฑ
ํ์ผ์ด ๋ค๋ฅธ ํ์ผ์ ๋ถ๋ฌ์ฌ ์ ์์
๋ ์ด์์์ ์ ํ ์ ์์
์๋ฌ ๋ฐ์ ์ ํ ํ๋ฆฟ ์์ง๊ณผ ์๊ด์์ด ํ ํ๋ฆฟ ์์ง ๋ณ์๋ฅผ ์ค์ ํ๊ณ error ํ ํ๋ฆฟ์ ๋ ๋๋งํจ
const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');
const nunjucks = require('nunjucks');
dotenv.config();
const indexRouter = require('./routes');
const userRouter = require('./routes/user');
const app = express();
app.set('port', process.env.PORT || 3000);
app.set('view engine', 'html');
nunjucks.configure('views', {
express: app,
watch: true,
});
app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false,
},
name: 'session-cookie',
}));
app.use('/', indexRouter);
app.use('/user', userRouter);
app.use((req, res, next) => {
const error = new Error(`${req.method} ${req.url} ๋ผ์ฐํฐ๊ฐ ์์ต๋๋ค.`);
error.status = 404;
next(error);
});
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
res.status(err.status || 500);
res.render('error');
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค');
});
๐์ถ์ฒ๐
Node.js ๊ต๊ณผ์ - ๊ธฐ๋ณธ๋ถํฐ ํ๋ก์ ํธ ์ค์ต๊น์ง
https://www.inflearn.com/course/%EB%85%B8%EB%93%9C-%EA%B5%90%EA%B3%BC%EC%84%9C/dashboard