20211229

팡태(❁´◡`❁)·2022년 1월 4일
0

ihongss

목록 보기
5/11

CMD> nodemon --inspect ./bin/www


//파일명 : board.js
var express = require('express');
var router = express.Router();

// npm i mongodb --save
const db = require('mongodb').MongoClient;
// mongodb://아이디:암호@서버주소:포트번호/DB명
const dbUrl = 'mongodb://id200:pw200@1.234.5.158:37017/db200';

/
db.sequence.insert([
{_id : 'SEQ_BOARD_NO', seq : 1},
{_id : 'SEQ_BOARDREPLY_NO', seq : 1},
{_id : 'SEQ_ITEM_NO', seq : 10001}
]);
/

//get(조회), post(추가), put(수정), delete(삭제)

// 글쓰기 : http://localhost:3000/board/insert
// req : request : 들어오는 값의 정보 => POST -> 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("--------------------------");

    // 접속(1) -> DB선택 -> 컬렉션 -> CRUD(추가, 수정, 삭제, 조회)
    // 1회만 : dbConn DB연결
    const dbConn = await db.connect(dbUrl);
    
    const coll   = dbConn.db("db200").collection("sequence");
    // 글번호 자동으로 {가져오기}, {수정하기}
    // _id가 SEQ_BOARD_NO인것을 가지고 오고,
    // seq값을 기존값에 1증가시킴
    const result = await coll.findOneAndUpdate(
        { _id:'SEQ_BOARD_NO' }, { $inc : { seq : 1} }
    );
    //글번호
    console.log(result.value.seq);

    const coll1   = dbConn.db("db200").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()    // 현재시간
    });
    //{ acknowledged: true, insertedId: 10 }
    console.log(result1);
    if( result1.insertedId > 0 ){
        return res.send({status:200});
    }
    return send({status:-1});
}
catch(err){
    console.error(err);
    return res.send({status:-1});
}

});

// 게시물 상세내용 : http://localhost:3000/board/selectone?no=45
// 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) -> 전체 가져오기
    const dbConn = await db.connect(dbUrl);
    const coll   = dbConn.db("db200").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});
}

});

// 게시물 목록 : http://localhost:3000/board/select
router.get('/select', async function(req, res, next) {
try {
// 페이지 정보가 전달
const page = Number(req.query.page);
// 1 -> skip(0) -> skip( (page-1) * 10 )
// 2 -> skip(10)
// 3 -> skip(20)

    // DB접속 -> DB선택 -> 컬렉션(board) -> 전체 가져오기
    const dbConn = await db.connect(dbUrl);
    const coll   = dbConn.db("db200").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});
}

});

// 조회수 증가 : http://localhost:3000/board/updatehit?no=글번호
router.put('/updatehit', async function(req, res, next) {
try {
const no = Number(req.query.no); //글번호
// DB접속 -> DB선택 -> 컬렉션(board) -> 조회수변경
const dbConn = await db.connect(dbUrl);
const coll = dbConn.db("db200").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:-1});
}
catch(err){
    console.error(err);
    return res.send({status:-1, result : err});
}

});

// 게시물 삭제 : http://localhost:3000/board/delete?no=11
// paramter은 글번호 no
router.delete('/delete', async function(req, res, next) {
try{
//문자를 숫자로 => Number( 바꿀문자 )
//숫자를 문자로 => String( 바꿀숫자 )
const no = Number(req.query.no);

    // DB접속 -> DB선택 -> 컬렉션(board) -> 삭제
    const dbConn = await db.connect(dbUrl);
    const collection = dbConn.db("db200").collection("board");
    const result = await collection.deleteOne({_id:no});
    console.log(result);//삭제가 되던 안되던
    // { acknowledged: true, deletedCount: 1 }
    if(result.deletedCount === 1){
        return res.send({status:200});
    }
    return res.send({status:0});  //삭제를 못한경우
}
catch(err) { // 데이터 접속X(정보가 틀린경우, DB전원, 네트워크)
    console.error(err);
    return res.send({status:-1 , result : err}); // 시스템오류
}

});

// 게시물 수정 : http://localhost:3000/board/update
router.put('/update', async function(req, res, next) {
try{
// 제목, 내용만 수정가능 + 조건으로 사용할 글번호
const no = Number(req.body.no);
const title = req.body.title;
const content = req.body.content;
// body : 안보이게 보내거나 긴내용을 보내거나
// query : 보이게 내용일 길지 않을때

    // DB접속 -> DB선택 -> 컬렉션(board) -> 삭제
    const dbConn = await db.connect(dbUrl);
    const collection = dbConn.db("db200").collection("board");
    const result = await collection.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});
}

});

// 이전글 : http://localhost:3000/board/prevno?cno=11
router.get('/prevno', async function(req, res, next) {
try {
const no = Number(req.query.cno);

    const dbConn = await db.connect(dbUrl);
    const collection = dbConn.db("db200").collection("board");
    // 미만 { $lt  : }   <
    // 이하 { $lte : }   <=
    // 초과 { $gt  : }   > 
    // 이상 { $gte : }   >=
    const result = await collection.find(
        { _id : {$lt : no } },  //조건
        { projection : {_id : 1} } // 필요한 항목(_id만)
    ).sort({_id:-1}).limit(1).toArray();

    // result =>  [ { _id: 56 } ]  => result[0]._id
    // [{}] ,   []
    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});
}

});

// 다음글 : 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 collection = dbConn.db("db200").collection("board");
    // 미만 { $lt  : }   <
    // 이하 { $lte : }   <=
    // 초과 { $gt  : }   > 
    // 이상 { $gte : }   >=
    const result = await collection.find(
        { _id : {$gt : no } },  //조건
        { projection : {_id : 1} } // 필요한 항목(_id만)
    ).sort({_id:1}).limit(1).toArray();

    // result =>  [ { _id: 56 } ]  => result[0]._id
    // [{}] ,   []
    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});
}

});

module.exports = router;

=======================================

이미지 첨부
CMD> npm i multer --save


// 파일명 : config/db.js
module.exports = {
// mongodb://아이디:암호@서버주소:포트번호/DB명
mongodbURL : 'mongodb://id200:pw200@1.234.5.158:37017/db200',
mongodbUSER : 'id200',
mongodbDB : 'db200',
mongodbPW : 'pw200',
}


// 파일명 : routes/item.js
var express = require('express');
var router = express.Router();

// CMD> npm i mongodb --save
const db = require('mongodb').MongoClient;

// config/db.js 파일의 내용 가져오기
const DBURL = require('../config/db').mongodbURL;
const DBNAME = require('../config/db').mongodbDB;

// CMD> npm i multer --save
const multer = require('multer');
// 특정폴더에 파일을 보관 or 메모리(DB에 저장)
const upload = multer({storage:multer.memoryStorage()});

/
db.sequence.insert([
{_id : 'SEQ_BOARD_NO', seq : 1},
{_id : 'SEQ_BOARDREPLY_NO', seq : 1},
{_id : 'SEQ_ITEM_NO', seq : 10001}
]);
/

// 물품등록 : http://localhost:3000/item/insert
// 이미지1, 물품코드(X), 물품명, 물품내용, 물품가격, 재고수량, 등록일(X)
router.post('/insert', upload.single("file"), async function(req, res, next) {
try {
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("sequence");
const result = await coll.findOneAndUpdate(
{ _id:'SEQ_ITEM_NO' }, { $inc : { seq : 1} }
);
//console.log(result.value.seq);

    const obj = {
        _id  : result.value.seq,  // 물품번호(자동부여)
        name : req.body.name, //물품명, 물품내용, 가격, 수량
        content : req.body.content,
        price : req.body.price ,
        quantity : req.body.quantity,
        filename : req.file.originalname, //파일명
        filetype : req.file.mimetype,
        filedata : req.file.buffer,
        filesize : req.file.size,
        regdate  : new Date()
    };

    const coll1   = dbConn.db(DBNAME).collection("item");
    const result1 = await coll1.insertOne(obj);
    if( result1.insertedId > 0 ){
        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/item/image?no=2
router.get('/image', async function(req, res, next) {
try {
const no = Number(req.query.no);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");

    const result = await coll.findOne(
        { _id : no }, //조건
        { projection : {filedata:1, filetype:1} } //필요한 항목만
    );
    console.log(result);
    res.contentType(result.filetype);// json ->image/jpeg
    return res.send(result.filedata.buffer);
}
catch(err) {
    console.error(err);
    return res.send({status:-1, result : err});
}

});

// 물품목록 : http://localhost:3000/item/select?page=1
router.get('/select', async function(req, res, next) {
try {
const page = Number(req.query.page);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");

    // 물품코드, 물품명, 가격, 수량, 등록일
    const result = await coll.find(
            {},    // 조건
            { projection : {_id:1, name:1, price:1, quantity:1, regdate:1} }  // 가져올 항목만
        )
        .sort({_id:-1})  // 1 오름차순, -1 내림차순
        .skip((page-1) * 10 )     // 생략할 개수
        .limit(10)       // 10개 까지만
        .toArray();

    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});
}

});

module.exports = router;


//파일명 : BoardOne.vue

<div>
    <el-card shadow="always">
        <h3>BoardOne.vue</h3>
        글번호 : {{item._id}}
        글제목 : {{item.title}}
        조회수 : {{item.hit}}

        <router-link to="/board">
            <button>글목록으로 이동</button>
        </router-link>
        <button @click="handleDelete(item._id)">글삭제</button>
        <button @click="handleUpdate">글수정</button>
        <button @click="handleNext">다음글</button>
        <button @click="handlePrev">이전글</button>
    </el-card>

    <el-dialog v-model="dialogVisible" title="Tips" width="30%">
        <input type="text" v-model="item1._id" readonly/>
        <input type="text" v-model="item1.title" />
        <input type="text" v-model="item1.content" />
        <template #footer>
            <span class="dialog-footer">
                <el-button type="primary" @click="handleUpdateAction">수정</el-button>
                <el-button @click="dialogVisible = false">닫기</el-button>
            </span>
        </template>
    </el-dialog>
</div>

0개의 댓글