스프링부트 강의를 들을 때는 get, post 이외의 요청을 보내기 위해서 js로 fetch 메소드를 사용했다.
nodejs에서는 fetch 안쓰고도 다른 요청을 보낼 수 있다.
npm install method-override --save
method-overrid 모듈을 설치한다
const methodOverride = require('method-override');
app.use(methodOverride('_method'));
위 세팅의 의미는 먼저 설치한 method-override 모듈을 methodOverride 변수로 가져온 다음
request를 보낼 때 파라미터에
localhost:3000/coogle?_method=delete
이런 식으로 _method 의 값을 지정된 것으로 요청 method를 바꿔준다는 것이다.
위처럼 보내면 delete 로 요청하게 된다
//Contacts - show
app.get('/contacts/:id', function(req,res){
Contact.findOne({_id:req.params.id},function(err,contact){
if(err) return res.json(err);
res.render('contacts/show',{contact:contact});
});
});
라우팅 할 url 경로에 :id 와 같은 식으로 입력하면 해당 위치에 온 url 값을 req.params 에 저장된다.
따라서 req.params.id 로 참조할 수 있다.
이렇게 하면 put과 delete 요청도 쓸 수 있다.
// update
router.put('/:id', function(req, res){
req.body.updatedAt = Date.now(); //2
Post.findOneAndUpdate({_id:req.params.id}, req.body, function(err, post){
if(err) return res.json(err);
res.redirect("/posts/"+req.params.id);
});
});
// destroy
router.delete('/:id', function(req, res){
Post.deleteOne({_id:req.params.id}, function(err){
if(err) return res.json(err);
res.redirect('/posts');
});
});
get과 post 요청을 router.get, router.post 로 받는것과 같이 router.put, router.delete 메소드로 각각 수정, 삭제 요청을 받는다.
그리고 수정의 경우 db스키마객체 대상으로
findOneAndUpdate, deleteOne 메소드로 처리하는 걸 확인할 수 있다.
findOneAndUpdate 함수 : DB에서 해당 모델의 document를 하나 찾아 그 data를 수정한다.
첫 번째 parameter로 찾을 조건을 object로 입력하고,
두 번째 parameter로 update할 정보를 object로 입력data를 찾은 후 callback 함수를 호출한다.
이 때, callback 함수로 넘겨지는 값은 수정되기 이전의 값이기 때문에 업데이트 된 후의 값을 보고 싶다면 callback함수 전에 parameter로 {new:true}를 넣으면 된다.
deleteOne 함수 : DB에서 해당 model의 document를 하나 찾아 삭제한다.
첫 번째 parameter로 찾을 조건을 object로 입력하고,
data를 찾은 후 callback 함수를 호출한다.
<form action="/contacts/<%= contact._id %>?_method=delete" method="post">
<a href="#" onclick="confirm('Do you want to delete this?')?this.parentElement.submit():null;">Delete</a>
</form>
뷰페이저에서는 이런식으로 request 보내는 url의 주소의 파라미터에 ?_method=delete 처럼 넣어서 이 요청을 delete로 바꾼다.
즉 form으로 감싸고 action 속성의 url값의 마지막 부분에
?_method=원하는요청방식
의 형태로 작성하면 된다.