20211229
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:[email protected]: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:[email protected]: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>
Author And Source
이 문제에 관하여(20211229), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gegus1220/20211229저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)