지난 번에는 MongoDB를 활용하여 검색 기능을 구현해봤다.
이번에는 댓글 업로드를 구현해보겠다. 역시나 강의를 보고 만들어보는 것이다.
사용하는 것
node.js, mongoDB, pug, (multer)
input(type="text" name="text")
name을 안 쓰면 node에서 value를 받을 수 없다. 꼭 적어주자.
const commentsApi = (req,res) =>{
const { body:{text}, params:{ id }, session: { user:{ _id }}=req;
if(!text){
return res.send("nothing Text")
// 들어온 댓글이 없을 시에 응답할 내용을 적는다.
}
}
단순하게 댓글만 만드는 것이라면 body를 추출하겠지만, MongoDB Model에 필요한 것이 user name, owner, contents Id이기 때문에 여러가지를 찾아주었다.
user의 id가 _id인 이유는 mongoDB로 user를 생성했을 때 부여되는 id의 이름이 _id로 나오기 때문이다. 그대로 session에 저장했으니 똑같은 이름으로 찾아준다.
각자 필요한 것을 찾아서 대입해주면 될 것 같다.
const commentsApi = (req,res) =>{
const { body:{text}, params:{ id }, session: { user:{ _id }}=req;
if(!text){
return res.send("nothing Text")
// 들어온 댓글이 없을 시에 응답할 내용을 적는다.
}
const contents = await Contents.findById(id);
const user = await User.findById(_id);
const comment = await Comment.create({
name: user.name,
text,
owner:_id,
contents:id,
});
return res.status(400).json({
newId: comment._id,
name: comment.name,
createdAt: comment.createdAt
}
url에 contents의 id를 담았으니 params로 id를 가져온다.
현재 로그인한 사람이 comment를 작성하고 있으니 해당 user의 id는 session에서 가져온다. (로그인/로그아웃 구현 참고)
MongoDB의 User,Contents에서 id를 대입해 각각 데이터를 찾아준 뒤,
Comment.create로 새로운 comment를 생성해준다.
필요한 내용은 model을 생성할 때, required 했던 옵션들이다. 나의 경우에는 name, text, owner, contents 가 있겠다.
name: 코멘트를 쓴 user의 이름
text: 코멘트 내용
owner: 코멘트를 쓴 user의 id
contents: 코멘트가 쓰여진 contents의 id
생성된 comment의 값을 어떻게 보내고 사용할지는 각자의 자유이다. 이와 동일한 방법으로 파일(비디오, 이미지)을 생성할 수 있는데, node에서 파일을 받을 수 없으니 이 경우에는 multer 라이브러리를 사용한다.
middleware를 통해 multer를 사용하면, req.body,session,params 말고도 req.file(보내는 파일이 2개이상일 때는 files)을 사용할 수 있다.
req.file을 통해 파일 값을 가져오면 된다. 나머지는 댓글을 만들 때와 동일하게 새로운 데이터를 생성하고 결과값을 자유롭게 사용하면 된다.