[Node.js] 글 수정

yellowbutter·2024년 6월 3일

NodeJs

목록 보기
4/8
post-thumbnail

📌1. 글 수정 폼 만들기

✨1. a태그에 글 수정 아이콘 추가

<a href="/edit/<%=글목록[i]._id>✏️</a>

✨2. edit.ejs 만들고 server.js에서 edit.ejs render

//server.js
app.get('/edit/:id', (요청, 응답) => {
  응답.render('edit.ejs')
})

✨3. 수정페이지엔 글의 제목과 내용이 이미 채워져있어야함

//server.js
app.get('/edit/:id', async (요청, 응답) => {
  let result = await db.collection('post').findOne({ _id : new ObjectId(요청.params.id) })
  응답.render('edit.ejs', {result : result})
})

✨4. edit.ejs에 기존 글 제목, 내용 추가

<input name="title" value="<%= result.title %>">
<input name="title" value="<%= result.content %>">

✨5. 전송 버튼 누르면 수정하기 요청

db.collection('컬렉션명').updateOne(
  { 변경할 조건 }, 
  { $set: { 덮어쓸 내용 } }
)
db.collection('post').updateOne( {a:1}, {$set: {a:4}}) 
  • a : 1을 가진 document를 찾아서 a 항목을 4로 수정해준다.
db.collection('post').updateOne( {a:1}, {$set: {title:'c'}}) 
  • a : 1을 가진 document를 찾아서 title 항목을 'c'로 바꿔준다.
  • a:1 -> c: 1
  • form 에선 GET, POST만 가능하고 PUT, DELETE 요청은 보낼 수 없다.method-override 쓰면 될 수도 있다.
//edit.ejs
<form class="form-box" action="/edit?_method=PUT" method="POST">
  <h4>수정하기</h4>
  <input name="id" value="<%= result._id %>">
  <input name="title" value="<%= result.title %>">
  <input name="content" value="<%= result.content %>">
  <button type="submit">전송</button>
</form>
//server.js
app.post('/edit', async (요청, 응답)=>{
  await db.collection('post').updateOne({ _id : new ObjectId(요청.body.id) },
    {$set : { title : 요청.body.title, content : 요청.body.content }
  })
  응답.redirect('/list')
}) 

✨6. method override : form 태그에서 PUT, DELETE 요청할 수 있는 법

  • AJAX를 쓰거나 method를 강제로 변경해주는 라이브러리를 쓰는방법
  1. 라이브러리 설치
npm install method-override 
  1. 상단에 코드 추가
const methodOverride = require('method-override')
app.use(methodOverride('_method')) 
  1. 폼 태그에서 요청할때
  • form 뒤에 method=PUT 이라고 표기, method는 POST
<form action="/edit?_method=PUT" method="POST"> </form> 

✨7. 숫자 증감해주고 싶을 때는 $inc

db.collection('컬렉션명').updateOne(
  { _id : new ObjectId('수정할 document _id') },
  { $set: { like : 1 } }
) 
  • 기존 값 덮어쓰기
db.collection('컬렉션명').updateOne(
  { _id : new ObjectId('수정할 document _id') },
  { $inc: { like : 1 } }
) 
  • 숫자 증감

✔️ $mul 쓰면 기존값에 곱셈을 시켜준다.

✔️$unset 쓰면 기존에 있던 필드를 삭제해준다. like 항목 자체를 아예 제거해버린다.

✔️아예 삭제보다는 그냥 빈 문자열이나 0을 집어넣거나 하는 경우가 더 편할 수도 있다.

✨8. 여러 document 동시 수정은 updateMany

db.collection('컬렉션명').updateMany(
      { title : '오늘 저녁은 닭가슴살' },
      { $set: { title : '아니고 치킨임' } }
)

title이 '오늘 저녁은 닭가슴살'로 되어있는 모든 document를 찾아서

title 항목을 '아니고 치킨임'로 덮어쓰기를 해준다.

✨9. 조건에 맞는 것만 updateMany하기 ($gt, $lt 연산자)

  • 정확히 일치하는 document가 아니라
    특정 조건을 만족하는 document를 전부 수정하고 싶을 때
db.collection('컬렉션명').updateMany(
  { like : { $gt: 5 } },
  { $set: { like : 100 } }
) 
  • like 항목이 5보다 큰 document만 전부 필터링한 다음
    like 항목을 100으로 일괄 수정해버린다.

-gt는 greater than이라는 뜻이라 5이상 등 값 범위를 지정하고 싶을때는
저런식으로 사용한다.

  • ✔️ $gt(greater than) :'초과'

  • ✔️ $gte(greater than eqal):'이상'

  • ✔️ $lt(lesser than):'미만'

  • ✔️$lte : '이하'

  • ✔️$ne : not equal

  • 예를 들어 like가 10이 아닌 것만 필터링해서 수정할 수도 있다.

✨ 1. DB에있던 document 하나 수정하려면 db.collection().updateOne()
✨ 2. 수정할 때 $set연산자 쓰면 덮어쓰기, $inc는 기존에 있던 숫자를 원하는 만큼 증감 가능
✨ 3. 여러개 document 한 번에 수정하려면 updateMany 쓰면 되는데 거기서는 $gt같은걸로 특정조건을 만족하는 document만 필터링해서 수정해버릴 수도 있음
✨ 4. 서버에서 어떤 정보가 필요한데 근데 서버에서 찾을 수 없으면
유저에게 보내라고하거나 DB에서 출력해보자.
✨ 5. method override 사용하면 폼태그에서도 put, delete 요청 가능.

profile
기록은 희미해지지 않는다 🐾🧑‍💻

0개의 댓글