var express = require('express');
var router = express.Router();
// npm i mongodb --save
const db = require('mongodb').MongoClient;
// mongodb://아이디:암호@서버주소:포트번호/db명
const dbUrl = require('../config/db').mongodbURL; // db.js에 있는거 가져와서 씀
// get(조회), post(추가), put(수정), delete(삭제)
// localhost:3000/board/insert
// req(request) 들어오는 값의 정보 -> req.body
// res(response) 전달하는 값의 정보
router.post('/insert', async function(req, res, next) {
try {
console.log("----------------------");
console.log(req.body);
// { title: '제목', writer: '홍길동', content: 'aaa' }
console.log("----------------------");
// 접속 - DB선택 - 컬렉션 선택 - CRUD(추가, 수정, 삭제, 조회)
// 1회만 함
const dbConn = await db.connect(dbUrl);
//DataBase에 전달된 자료를 1개 추가함
// 글 번호 자동으로 {가져오기}, {수정하기}
// _id가 SEQ_BOARD_NO인 것을 가져오고 seq값을 1 증가
const coll = dbConn.db("db210").collection("sequence");
const result = await coll.findOneAndUpdate(
{ _id: 'SEQ_BOARD_NO' }, { $inc: { seq: 1 } }
);
// 글 번호
console.log(result.value.seq);
//2. 테이블 == 컬렉션
const coll1 = dbConn.db("db210").collection("board");
const result1 = await coll1.insertOne({
_id : Number(result.value.seq), // 글번호(PK)
title : req.body.title, // 전송되는 제목
content: req.body.content, // 전송되는 내용
writer : req.body.writer, // 전송되는 작성자
hit : 1, // 조회수
regdate: new Date() // 현재시간
});
console.log(result1); // -> { acknowledged: true, insertedId: 10 }
if( result1.insertedId > 0){
return res.send({status:200});
}
return res.send({status:0});
}
catch(err) {
console.error(err);
return res.send({status:-1}); // 에러가 나면 888을 찍는다
}
});
// 게시물 상세내용: http://localhost:3000/board/selectone
// req 전송되는 값: GET -> req.query
router.get('/selectone', async function(req, res, next) {
try{
const no = Number(req.query.no);
console.log(no);
// DB접속 -> DB선택 -> 컬렉션(board) -> 1개 가져오기
const dbConn = await db.connect(dbUrl);
const coll = dbConn.db("db210").collection("board");
const result = await coll.findOne({ _id: no });
console.log(result);
return res.send({status:200, result: result});
}
catch(err) {
console.error(err);
return res.send({status:-1, result: err}); // 에러가 나면 888을 찍는다
}
});
// 게시물 목록: http://localhost:3000/board/select
router.get('/select', async function(req, res, next) {
try{
// 페이지 정보 전달
const page = Number(req.query.page);
// page = 1 -> skip(0), page = 2 -> skip(10) ...
// skip( (page - 1) * 10 )
const dbConn = await db.connect(dbUrl);
const coll = dbConn.db("db210").collection("board");
// 여러개 가져오기 find(), toArray() 변환
const result = await coll.find({})
.sort({_id:-1}) // 1: 오름차순, -1: 내림차순
.skip((page-1)*10) // 생략할 개수
.limit(10) // 10개만
.toArray();
console.log(result);
// 페이지네이션에서 사용할 전체 게시물 수
const total = await coll.countDocuments({});
return res.send({status:200, result: result, total:total});
}
catch(err) {
console.error(err);
return res.send({status:-1, result: err}); // 에러가 나면 888을 찍는다
}
});
// 조회수 증가: http://localhost:3000/board/updatehit
router.put('/updatehit', async function(req, res, next) {
try{
const no = Number(req.query.no);
const dbConn = await db.connect(dbUrl);
const coll = dbConn.db("db210").collection("board");
// 변경하기 updateOne({조건}, {변경할 내용})
const result = await coll.updateOne(
{_id: no},
{$inc: {hit :1}}
);
console.log(result);
if(result.modifiedCount === 1) {
return res.send({status:200});
}
return res.send({status:200});
}
catch(err) {
console.error(err);
return res.send({status:-1, result: err}); // 에러가 나면 888을 찍는다
}
});
// 게시물 삭제: http://localhost:3000/board/delete
router.delete('/delete', async function(req, res, next) {
try{
const no = Number(req.query.no);
const dbConn = await db.connect(dbUrl);
const coll = dbConn.db("db210").collection("board");
// 변경하기 updateOne({조건}, {변경할 내용})
const result = await coll.deleteOne(
{_id: no},
// { $upset: {_id: no}}
);
console.log(result);
if(result.deletedCount === '1') {
return res.send({status:200});
}
return res.send({status:0});
}
catch(err) { // 정보가 틀린 경우. 물리적 오류. DB전원. 네트워크.
console.error(err);
return res.send({status:-1, result: err}); // 에러가 나면 -1 을 찍는다
}
});
// 게시물 수정: http://localhost:3000/board/update
router.put('/update', async function(req, res, next) {
// 제목, 내용만 수정 가능
try{
const no = Number(req.body.no);
const dbConn = await db.connect(dbUrl);
const coll = dbConn.db("db210").collection("board");
const title = req.body.title;
const content = req.body.content;
// 변경하기 updateOne({조건}, {변경할 내용})
const result = await coll.updateOne(
{_id: no},
{ $set:{title: title, content: content}}
);
console.log(result);
if(result.modifiedCount === 1) {
return res.send({status:200});
}
return res.send({status:0});
}
catch(err) {
console.error(err);
return res.send({status:-1, result: err}); // 에러가 나면 -1을 찍는다
}
});
// 이전글: http://localhost:3000/board/prevno
router.get('/prevno', async function(req, res, next) {
try{
const no = Number(req.query.cno);
const dbConn = await db.connect(dbUrl);
const coll = dbConn.db("db210").collection("board");
const result = await coll.find(
{ _id: { $lt: no } },
{ projection: { _id: 1 } } // 필요한 정보만 가져옴(cmd로)
// {$lt: } = 미만, {$lte: } = 이하, {$gt: } = 초과, {$gte: } = 이상
).sort({_id: -1}).limit(1).toArray();
console.log(result);
if(result.length === 1){ //
return res.send({ status:200, no:result[0]._id });
}
return res.send({ status:200, no:0 });
}
catch(err) {
console.error(err);
return res.send({status:-1, result: err}); // 에러가 나면 888을 찍는다
}
});
// 다음글: http://localhost:3000/board/nextno
router.get('/nextno', async function(req, res, next) {
try{
const no = Number(req.query.cno);
const dbConn = await db.connect(dbUrl);
const coll = dbConn.db("db210").collection("board");
const result = await coll.find(
{_id: {$gt: no}},
{ projection: { _id: 1 } } // 필요한 정보만 가져옴(cmd로)
).sort({_id: 1}).limit(1).toArray;
console.log(result);
if(result.length === 1){
return res.send({ status:200, no:result[0]._id });
}
return res.send({ status:200, no:0 });
}
catch(err) {
console.error(err);
return res.send({status:-1, result: err}); // 에러가 나면 888을 찍는다
}
});
module.exports = router;