728x90
λ°μν
π‘ μ€μ΅ ν¬μΈνΈ!
π νμκ°μ κΈ°λ₯ λ§λ€κΈ°
- μ΄μ μ 건λλ΄ νμκ°μ
κΈ°λ₯μ λ§λ€μ΄ μ¬μ©μλ₯Ό μΆκ°ν΄λ³΄μλ€.
(μ€λ³΅ μμ΄λ νμΈ κΈ°λ₯μ μΆν λ§λ€ μμ )
π κ²μλ¬Ό μμ±μλ§ κ²μλ¬Ό μμ κΆν μ£ΌκΈ°
- λ‘κ·ΈμΈν μ¬μ©μλ§ λ³ΈμΈμ κ²μκΈμ μμ ν μ μλ κΈ°λ₯μ λ§λ€μ΄λ³΄μλ€.
(λ‘κ·ΈμΈνμ§ μκ³ κ²μλ¬Ό λ±λ‘νλ κ²½μ° μ€λ₯κ° λ°μνλ λΆλΆμ μΆν μμ μμ )
π νμκ°μ κΈ°λ₯ λ§λ€κΈ°
π€ νμκ°μ EJS νμΌ λ§λ€κΈ°
<h4 class="container mt-5"><strong>νμκ°μ
</strong></h4>
<div class="container mt-4">
<form action="/register" method="POST">
<div class="form-group my-4">
<label class="mb-2">μμ΄λ</label>
<input type="text" class="form-control" name="id">
</div>
<div class="form-group my-4">
<label class="mb-2">λΉλ°λ²νΈ</label>
<input type="password" class="form-control" name="pw">
</div>
<button type="submit" class="btn btn-danger fw-bold">νμκ°μ
</button>
</form>
</div>
- κ°μ¬λμ λΉ λ₯Έ μμ μ μν΄ λ‘κ·ΈμΈ νμ΄μ§μ νμκ°μ λ μ΄μμμ μΆκ° μμ±νμ ¨λλ°, λλ νμκ°μ νμ΄μ§λ₯Ό λ°λ‘ λ§λ€μλ€. (μμ νμκ°μ νμ΄μ§μ λ‘κ·ΈμΈ νμ΄μ§λ λΆλ¦¬ν΄μ£Όμ΄μΌ λ§μμ΄ νΈμνλ€.)
- λ μ΄μμ μ체λ λ‘κ·ΈμΈ νμ΄μ§μ λμΌνκ² νκ³ λ΄μ©κ³Ό action μμ±λ§ μμ ν΄μ£Όμλ€.
π€ νμκ°μ κΈ°λ₯ κ΄λ ¨ JavaScript μ½λ μμ±νκΈ°
app.get('/register', function(req, res){
res.render('register.ejs');
})
app.post('/register', function(req, res){
db.collection('login').insertOne({id : req.body.id, pw: req.body.pw}, function(err, result){
res.redirect('/login');
})
})
- μΌλ¨, λκ΅°κ°κ° /register κ²½λ‘λ‘ GET μμ²μ νλ©΄ νμκ°μ νμ΄μ§κ° 보μ΄λλ‘ ν΄μ£Όμλ€.
- κ·Έ λ€μμΌλ‘ λκ΅°κ°κ° νΌμ μμ±ν νμ νμκ°μ λ²νΌμ ν΄λ¦νλ©΄ μμ±ν μμ΄λμ λΉλ°λ²νΈλ₯Ό db.collection μ login μ μΆκ°νκ³ λ‘κ·ΈμΈ νμ΄μ§λ‘ μ΄λνκ²λ μ€μ ν΄μ£Όμλ€.
- κ°μ΄λ‘ λ§λ νμμ΄λ―λ‘ κ΅μ₯ν κ°μνλμμ§λ§ μ€μ§μ μΌλ‘ μ΄ νμκ°μ
κΈ°λ₯μ ꡬνν λμλ μκ°ν΄λ΄μΌν λΆλΆλ€μ΄ κ½€ μλ€.
- νμκ°μ νλ €κ³ νλ μμ΄λκ° μ΄λ―Έ DB μ μ‘΄μ¬νλ μμ΄λμΈμ§ νμΈνλ€. (μμ΄λ μ€λ³΅ νμΈ)
- νμκ°μ νλ €κ³ νλ μμ΄λκ° μμ΄λ μμ± μμμ μ μ§ν€κ³ μλμ§ νμΈνλ€.
- λΉλ°λ²νΈλ₯Ό DB μ μ μ‘νκΈ° μ μ μνΈνλ₯Ό νλμ§ νμΈνλ€. (보μ λ¬Έμ λ°©μ§)
π κ²μλ¬Ό μμ±μλ§ μμ κΆν μ£ΌκΈ°
π€ κ²μλ¬Ό λ±λ‘ν λ, κ²μλ¬Ό μμ±μ μ 보 λ£κΈ°
// λκ΅°κ°κ° νΌμμ /add λ‘ POST μμ²μ νλ©΄
app.post('/add', function(req, res){
// κ²μλ¬Όλ§λ€ λ²νΈλ₯Ό λ¬μ μ μ₯νκΈ°
// DB.counter λ΄μμ 'μ΄κ²μλ¬Όκ°μ'λ₯Ό μ°Ύμμ
db.collection('counter').findOne({name : 'μ΄κ²μλ¬Όκ°μ'}, function(err, result){
// console.log(result.totalPosts);
// 'μ΄κ²μλ¬Όκ°μ' μ totalPosts κ°μ totalPosts λ³μμ μ μ₯
var totalPosts = result.totalPosts;
// μ μ‘λ°μ μ μ₯ν λ°μ΄ν°λ€μ submitData λ³μμ μ μ₯
var submitData = {
_id : totalPosts + 1,
ν μΌ: req.body.content,
λ§κ°μΌ : req.body.date,
μμ±μ: req.user._id
}
// μ΄μ DB.post μ λ²νΈλ₯Ό λ¨ μλ‘μ΄ κ²μλ¬Όμ μΆκ°
db.collection('post').insertOne(submitData, function(err, result){
console.log('κ²μλ¬Ό μ μ₯ μλ£!');
// DB.counter μ 'μ΄κ²μλ¬Όκ°μ' μ totalPosts κ°μ 1μ© μ¦κ°
db.collection('counter').updateOne({name : 'μ΄κ²μλ¬Όκ°μ'},{ $inc : {totalPosts: 1} }, function(err, result){
console.log('μ΄ κ²μλ¬Ό κ°μ μ
λ°μ΄νΈ μλ£!');
});
});
});
// res.send('κ²μλ¬Ό μΆκ° μλ£');
res.redirect('/list')
})
- κΈ°μ‘΄μ μμ±νλ μ½λμ κ²½μ°, κ²μλ¬Όμ μμ± ν λ±λ‘νλ©΄ _id, ν μΌ, λ§κ°μΌ λ§ DB λ‘ μ μ‘λλλ‘ κ΅¬ννμκΈ°μ μμ±μλ μ μ μμλ€.
- λ°λΌμ, κ²μλ¬Όμ λ±λ‘ν λ μμ±μ λ₯Ό μΆκ°ν΄μ€μΌλ‘μ κ²μλ¬Ό μμ±μλ₯Ό ꡬλ³ν μ μλλ‘ νμλ€.
- μ£Όμν μ μ req.user κ΄λ ¨ μ 보λ€μ deserializeUser() ν¨μκ° μ 곡νλ―λ‘ passport κ΄λ ¨ μ½λλ€λ³΄λ€ μλμͺ½μΌλ‘ μ½λλ₯Ό μ΄λμμΌμ£Όμ΄μΌ νλ€.
- μ μ½λμμλ μ½λμ κ°λ μ±μ μν΄ submitData λΌλ λ³μμ μ μ‘λ°μ DB μ μ μ₯ν λ°μ΄ν°λ€μ λ΄μμ€ ν, ν΄λΉ λ³μλ‘ κΈ°μ‘΄μ μ½λλ₯Ό μμ ν΄μ£Όμλ€.
- μ΄μ κ²μλ¬Όμ μλ‘ λ±λ‘νλ©΄ μμ±μ μ 보λ post collection μ μ μ₯λλ κ²μ λ³Ό μ μλ€.
π€ κ²μλ¬Ό μμ±μλ§ κ²μκΈ μμ νλ κΆν μ£ΌκΈ°
// λκ΅°κ°κ° μμ λ²νΌμ ν΄λ¦νμ¬ /delete λ‘ DELETE μμ²μ νλ©΄
app.delete('/delete', function(req, res){
// DB μμ κ²μκΈ μμ νκΈ°
req.body._id = parseInt(req.body._id);
var delData = {_id : req.body._id, μμ±μ : req.user._id}
db.collection('post').deleteOne(delData, function(err, result){
console.log('κ²μλ¬Ό μμ μλ£');
res.status(200).send({message : 'μ±κ³΅νμ΅λλ€.'});
})
})
- κΈ°μ‘΄μ μ½λλ post collection μμ _id μ ν΄λΉνλ κ²μλ¬Όλ§μ μ°Ύμ μμ λ₯Ό μ§ννλ€.
- μ΄λ²μλ κ²μλ¬Ό μμ±μλ§ κ²μκΈμ μμ ν μ μμ΄μΌ νκΈ°μ, λ‘κ·ΈμΈν μ¬μ©μκ° req.user._id μ λ΄κ²¨ μλ μνμμ μμ νλ €λ κ²μλ¬Όμ μμ±μκ° req.user._id μ 쑰건μ λ§μ‘±νλ©΄ κ²μλ¬Όμ΄ μμ λλλ‘ ν΄μ£Όμλ€.
π€ μ λλ©μ΄μ ν¨κ³Ό λ¬Έμ μ²λ¦¬λ₯Ό μν΄ μ½λ μμ νκΈ°
- κ·Όλ° μ¬κΈ°κΉμ§λ§ νμ λ μκ°μ§ λͺ»ν λ¬Έμ κ° λ°μνλ€.
- λ°λ‘ μμ λ²νΌμ λλ₯΄κΈ°λ§ ν΄λ μ€μ λ‘ λ°μ΄ν°κ° μμ λλ μλλ μμ λμ΄λ³΄μ΄λ μ΄μ μ μ€μ ν΄λ μ λλ©μ΄μ ν¨κ³Όκ° λνλλ κ²μ΄λ€.
- κ°μμμλ 건λλ΄ λΆλΆμ΄λΌ μ΄ λΆλΆμ μ€μ€λ‘ ν΄κ²°ν λ°©λ²μ μ°ΎμμΌ νκ³ , μμΌλ‘ μΆμ νλ©΄μ μ λ°μ μΌλ‘ μμ μ νλλΌ μκ°μ΄ μ’ κ±Έλ Έλ€.
- μΌλ¨ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν λ΄ μκ°μ μ΄λ¬νλ€.
- ν μΌ λ¦¬μ€νΈ νμ΄μ§μμ μμ λ²νΌμ λλ₯΄λ©΄ κ²μλ¬Όμ _id μ ν¨κ» μμ±μ λ°μ΄ν°λ₯Ό /delete κ²½λ‘λ‘ μ μ‘νλ€.
- μ μ‘λ κ²μλ¬Ό λ°μ΄ν°μ _id μ μμ±μ λΆλΆμ λ°μμ¨λ€.
- κ²μλ¬Ό λ°μ΄ν°μ μμ±μμ νμ¬ μ¬μ©μμ _id λ₯Ό λΉκ΅νλ€.
- λ§μ½ λ λ°μ΄ν°κ° μΌμΉνλ©΄, κ²μλ¬Ό _id λ₯Ό κ²μνμ¬ μμ ν ν μ±κ³΅μ½λ 200 μ μ μ‘νκ³ , μΌμΉνμ§ μμΌλ©΄ μ€ν¨μ½λ 400 μ μ μ‘νλ€.
- EJS νμΌμ΄ μ±κ³΅μ½λλ₯Ό μ λ¬λ°μΌλ©΄ κ²μλ¬Όμ fadeOut ν¨κ³Όλ₯Ό μ£Όκ³ , μ€ν¨μ½λλ₯Ό μ λ¬λ°μΌλ©΄ μλ¬΄λ° ν¨κ³Όκ° λ°μνμ§ μλλ€.
<h4 class="container mt-5 mb-4"><strong>ν μΌ λ¦¬μ€νΈ</strong></h4>
<div class="container input-group mb-1">
<input class="form-control" id="search-input">
<button class="input-group-append btn btn-danger" id="search">κ²μ</button>
</div>
<div class="container mt-3">
<ul class="list-group">
<% for(let i = 0; i < post.length; i++){ %>
<li class="list-group-item mb-2" style="border-top-width: 1px">
<p class="mb-2" style="font-size: 14px;">κΈλ²νΈ : <%= post[i]._id %></p>
<p class="mb-2" style="font-size: 18px;">ν μΌ : <%= post[i].ν μΌ %></p>
<p class="mb-2" style="font-size: 16px;">λ§κ°μΌ : <%= post[i].λ§κ°μΌ %></p>
<button class="btn btn-primary edit"><a style="color: white; text-decoration: none;" href="/edit/<%= post[i]._id %>">μμ </a></button>
<button class="btn btn-danger delete" data-id="<%= post[i]._id %>" data-writer="<%= post[i].μμ±μ %>">μμ </button>
</li>
<% } %>
</ul>
</div>
- μ΄μ μ κΈμ°κΈ° νμ΄μ§μμ Submit λ²νΌμ λλ₯΄λ©΄ κ²μλ¬Όμ _id μ ν¨κ» μμ±μμ μ 보λ DB λ‘ μ μ‘λμ΄ μ μ₯λμ΄μΌ νλ€.
- κ·Έλμ html μ½λ λΆλΆμ button νκ·Έμ data-writer λ₯Ό μΆκ°ν΄μ£Όμλ€.
$('.delete').click(function(e){
let postNum = e.target.dataset.id;
let writer = e.target.dataset.writer;
let clicked = $(this);
$.ajax({
method : 'DELETE',
url : '/delete',
data : {_id : postNum, μμ±μ : writer}
}).done(function(result){
// AJAX μ±κ³΅ν κ²½μ° μ€νν μ½λ
console.log('μ±κ³΅νμ΅λλ€.');
clicked.parent('li').fadeOut();
}).fail(function(err){
// AJAX μ€ν¨ν κ²½μ° μ€νν μ½λ
console.log('μ€ν¨νμ΅λλ€.');
})
})
- κΈ°μ‘΄μ data-id λ§ λ°μλ€λ©΄, μμ λ²νΌμ μΆκ°ν΄λ data-writer λ λ°μμμ /delete κ²½λ‘λ‘ μ μ‘ μ data κ°μ²΄μ λ΄μ κ°μ΄ μ μ‘ν΄μ£Όμλ€.
// λκ΅°κ°κ° μμ λ²νΌμ ν΄λ¦νμ¬ /delete λ‘ DELETE μμ²μ νλ©΄
app.delete('/delete', function(req, res){
// DB μμ κ²μκΈ μμ νκΈ°
req.body._id = parseInt(req.body._id);
var delData = {_id : req.body._id}
console.log(req.body);
if (req.body.μμ±μ == req.user._id) {
db.collection('post').deleteOne(delData, function(err, result){
console.log('κ²μλ¬Ό μμ μλ£');
res.status(200).send({message : 'μ±κ³΅νμ΅λλ€.'});
})
} else {
console.log('κ²μλ¬Ό μμ μ€ν¨');
res.status(400).send({message : 'μ€ν¨νμ΅λλ€.'});
}
})
- κΈ°μ‘΄μ console.log(req.body) λ₯Ό ν΄λ³΄μμ λ _id λ§ μΆλ ₯λμλ λ°λ©΄, μ΄μ λ _id μ μμ±μκ° μΆλ ₯λλ€.
- μ΄μ μ΄κ²μ νμ©ν΄μ req.body.μμ±μ(κ²μλ¬Ό μμ±μ) μ req.user._id(νμ¬ λ‘κ·ΈμΈν μ¬μ©μ) λ₯Ό λΉκ΅ν μ μκ² λμλ€.
- λ λ°μ΄ν°λ₯Ό λΉκ΅νμ λ μΌμΉνλ€λ©΄ νμ¬ λ‘κ·ΈμΈν μ¬μ©μκ° κ²μλ¬Ό μμ±μλκΉ ν΄λΉ κ²μλ¬Όμ _id λ₯Ό λ°μμμ λ°μ΄ν°λ₯Ό μμ νλ€.
- μμ νκ³ λμλ 'κ²μλ¬Ό μμ μλ£' λΌλ 문ꡬλ₯Ό λμ μ λλ‘ μμ λμλμ§ νμΈνλ€.
- res.status(200).send() κΉμ§ ν΄μ£Όλ©΄ ν μΌ λ¦¬μ€νΈ EJS νμΌμ .done() ν¨μ λ΄μ fadeOut() ν¨μκ° μ€νλλ€.
- λ λ°μ΄ν°λ₯Ό λΉκ΅νμ λ μΌμΉνμ§ μλλ€λ©΄ νμ¬ λ‘κ·ΈμΈν μ¬μ©μκ° κ²μλ¬Ό μμ±μκ° μλλΌλ μ΄μΌκΈ°μ΄λ―λ‘ κ²μλ¬Όμ΄ μμ λμ΄μλ μλλ€.
- λ°λΌμ, 'κ²μλ¬Ό μμ μ€ν¨' λΌλ 문ꡬλ₯Ό λμμ€λ€.
- res.status(400).send() λ₯Ό ν΄μ£Όμ΄ ν μΌ λ¦¬μ€νΈ EJS νμΌμ .fail() ν¨μκ° μ€νλμ΄ μ λλ©μ΄μ ν¨κ³Όλ λ°μνμ§ μλλ€.
728x90
λ°μν
'[κ°λ°] Practice > Node.js MongoDB' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Node.js / MongoDB] μ±ν κΈ°λ₯ λ§λ€κΈ° (0) | 2022.03.18 |
---|---|
[Node.js / MongoDB] μ΄λ―Έμ§ μ λ‘λ & μ΄λ―Έμ§ μλ² λ§λ€κΈ° (0) | 2022.03.16 |
[Node.js / MongoDB] κ²μ κΈ°λ₯ λ§λ€κΈ° (1) | 2022.03.14 |
[Node.js / MongoDB] νμμΈμ¦κΈ°λ₯ λ§λ€κΈ° (0) | 2022.03.14 |
[Node.js / MongoDB] κΈ μμ κΈ°λ₯ λ§λ€κΈ° (0) | 2022.03.12 |