form 태그를 쓰게 되면 method는 get, post 요청 밖에 못하게 된다.
글을 수정할 시 method 방식을 put으로 rest-api식으로 하는 것이 좋은데, 이를 위해서
method-override 라이브러리를 다운 받으면 된다.
우선 터미널에
npm imstall method-override
라이브러리를 다운 받아주고
server.js 파일 상단에
const express = require('express')
const app = express()
const methodOverride = require('method-override')
app.use(methodOverride('_method'))
이렇게 코드를 작성해주면 셋팅 끝
나 같은 경우 앞서 만든 글 작성 기능(nodejs) 코드가 있었고,
글 수정 코드 또한 만들어보았다.
edit.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>update</title>
<link href="/main.css" rel="stylesheet">
</head>
<body class="grey-bg">
<%- include('nav.ejs') %>
<form class="form-box" action="/edit?_method=PUT" method="POST">
<h4>수정하기</h4>
<input name="id" value="<%= post._id %>" type="hidden">
<input name="title" value="<%= post.title %>">
<input name="content" value="<%= post.content %>">
<button type="submit">수정하기</button>
</form>
</body>
</html>
server.js
app.put('/edit', async (req, resp) =>{
try{
let title = req.body.title
let content = req.body.content
let id = req.body.id
console.log(req.body);
if(title == '' || content == ''){
resp.send('빈칸은 안되어요');
}else{
await db.collection('post').updateOne({_id: new ObjectId(id)}, {$set : {title: title, content : content} })
resp.redirect('/list')
}
}catch(e){
console.log(e)
resp.status(500).send('Error!!!');
}
})
post방식이 아닌, put방식을 사용하기 위해서 form태그 url에서 /edit?_method=PUT 이렇게 작성해주었다.
그리고 server.js에서 해당 아이디를 가진 글을 updateOne을 통해서 데이터를 수정해주었다.
(물론, 데이터를 필수적으로 입력하게 두었다.)
근데 만약에 input에 담긴 id값을 어느 누구가 개발자 도구를 통해서 조작할 수 있다. 그럴 때는 서버측에서 세션id를 발급해주고, 해당 사용자인증을 해주면 되는데 그건 다음 게시물에서 작성해보도록 하자.
앞서 mongodb 수정 문법중 updateOne을 사용해보았다.
하지만 이거 이외에 또 다른 수정 문법들이 존재한다
만약 좋아요 갯수를 저장해둔 도큐먼트가 있다고 가정해보자
이렇게 id가 1번인 like와 id가 2번인 like가 각각의 도큐먼트로 존재한다.
만약 id가 1번인 도큐먼트의 like 갯수를 내가 원하는 갯수로 덮어 씌우고 싶다면?
db.collection('컬렉션명').updateOne(
{ _id : new ObjectId('수정할 document _id') },
{ $set: { like : 10 } }
)
이렇게 코드를 작성해줄 수 있다.
id가 1번인 like의 갯수가 변경이 되었다.
그렇다면 만약 +/- 를 하고싶다면?
db.collection('컬렉션명').updateOne(
{ _id : new ObjectId('수정할 document _id') },
{ $inc: { like : 2 } }
)
+2 를 해준 결과가 저장이 되었다.
- 를 해주고싶다면 -2 이렇게 붙이면 된다.
곱셉은?
db.collection('컬렉션명').updateOne(
{ _id : new ObjectId('수정할 document _id') },
{ $mul: { like : 2 } }
)
여러개의 도큐먼트를 수정해주고싶을 때가 있다.
예를 들어 like 갯수가 2개인 전체 도큐먼트를 like가 20개로 수정해주고 싶다면
db.collection('컬렉션명').updateMany({like : 2}, {$set : {like : 20} } )
수정 되었다.
여기서 조건식도 또한 나타낼 수 있다.
$gte : 10 -> 10 이상,
$gt: 10 -> 10 초과,
$lte : 10 -> 10 이하,
$lt : 10 -> 10 미만,
$ne : 10 -> 10이 아닌 것
20이상 like를 100개로 다 바꿔보자
db.collection('컬렉션명').updateMany({like : {$gte : 20}}, {$set : {like : 100} } )
잘 기억해두자.