자주 일어나는 오류.
몽고디비와 vs코드가 연결될때 이 문장을 삽입해 주면 된다.
/models/index.js
// models/index.js
const mongoose = require("mongoose");
mongoose.set('strictQuery',true)
// localhost의 27017 포트 번호로 MongoDB와 연결합니다.
// Database Name은 todo-demo 입니다.
mongoose.connect("mongodb://127.0.0.1:27017/todo-demo", {
useNewUrlParser: true,
useUnifiedTopology: true, // 이 두개는 몽고디비에 연결할때 추가로 하는 속성값
})
.then(value => console.log("MongoDB 연결에 성공하였습니다."))
.catch(reason => console.log("MongoDB 연결에 실패하였습니다."))
// 프로미스로 구현되있기에 덴,캐치가 가능
const db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error:")); // db 연결이 에러날 경우 에러메세지를 출력하는 코드
module.exports = db;
/models/todo.js
const mongoose = require('mongoose');
const TodoSchema = new mongoose.Schema({
value:String, // 할일이 어떤것인지 확인하는 컬럼
doneAt:Date, // 할일이 언제 완료되었는지 확인하는 컬럼
order:Number, // 몇번째 할일인지 확인하는 컬럼
});
TodoSchema.virtual('todoId').get(function(){
return this._id.toHexString()});
TodoSchema.set("toJSON",{ virtuals:true});
// 가상의 아이디.
module.exports = mongoose.model('Todo', TodoSchema);
app.js
const express = require("express");
const db = require('./models/index.js') // 모듈을 불러오는데 해당 index.js에서 몽고디비를 연결하는 코드가 있음. 즉, 이 코드가 실행되면 모듈을 불러옴과 동시에 몽고디비를 연결함.
const app = express();
const todosRouter = require("./routes/todos.router.js");
// const router = express.Router();
// router.get("/", (req, res) => { // api를 거친 다음 라우터가 출력되기에 api로 요청된 get메소드는 이코드가 실행된다.
// res.send("Hi!");
// });
app.use("/api", express.json(), todosRouter);
app.use(express.static("./assets"));
// app.use("/api", express.json(), router); // 미들웨어
// api로 들어온거면 express.json을 거치고 그 다음으로 라우터를 찾아가도록 하는 코드
app.listen(8080, () => {
console.log("서버가 켜졌어요!");
});
/routes/todos.router.js
const {response} = require('express');
const express = require('express');
const router = express.Router();
const Todo = require('../models/todo')
router.get('/', (req,res) => {
res.send('hi~');
});
router.post('/todos', async(req,res) => {
const {value} = req.body;
const maxOrderbyuserId = await Todo.findOne().sort("-order").exec(); // 테이블 Todo안에 있는 하나 조회할건데 조회방식은 오더기준으로 맨위에 있는 걸 조회할거야
const order = maxOrderbyuserId ?
maxOrderbyuserId.order + 1 : // maxorderbyuserId가 있을때 , (있다는 뜻은 값이 여러개일 수도 있으니 그 값에다가 +1을 해준다.)
1; // maxorderbyuserId가 없을때 오더 값이 할당된다. (없다는 뜻은 아무것도 없으니까 1을 설정해준다.)
const todo = new Todo({value:value, order:order});
await todo.save();
res.send({todo});
})
// 목록을 조회하는 메소드
router.get('/todos', async(req,res)=> {
const todos = await Todo.find().sort("-order").exec() // find는 조건을 입력하지 않을 경우 모든 데이터가 조회된다!
// 또한 sort("컬럼명")을 쓰면 그 컬럼명 기준으로 오름차순 정렬이 되는데, 컬럼명 앞에 마이너스를 붙일경우 내림차순이된다.
// 모든 조건이 완료되었을 경우 .exec를 붙여 완료를 시켜준다.
res.send({todos})
})
// 목록 순서를 변경하는 메소드(순서)
router.patch('/todos/:todoId', async(req,res) => {
const {todoId} = req.params;
const {order} = req.body;
// 1. todoIㅇ에 해당하는 할 일이 있는가 ?
// 1-1 todoId에 해당하는 할 일이 없으면 변경할 수 없으므로 에러를 출력해야한다.
const checkTodo = await Todo.findById(todoId);
if (!checkTodo){ // checkTodo가 없을 경우에는 에러를 출력해야한다.
return res.status(400).json({"ERROR!!":"존재하지 않는 할 일 입니다!"})
}
if (order) { // 오더가 있다는 말은 변경해주면 된다는 말
const targetTodo = await Todo.findOne({order:order}).exec();
if (targetTodo){
targetTodo.order = checkTodo.order; // 타겟이 있다면 바꿔준다.
await targetTodo.save(); // 바꿔준 값을 데이터베이스에 저장해둔다.
// 순서가 중요하며 만약 타겟이 있다면 바꿀 값이 있으니까 그 값을 먼저! 저장해 둔 다음 나 자신을 바꿔준다.
}
checkTodo.order = order;
await checkTodo.save(); // 타겟이 바꼈으니 이제 본인도 바꿔야한다.
}
res.send();
})
module.exports = router;'[내배캠] TIL, WIL > TIL' 카테고리의 다른 글
| 노드js (0) | 2022.12.22 |
|---|---|
| 자바 스크립트 (0) | 2022.12.21 |
| 알고리즘 (0) | 2022.12.19 |
| 자바 스크립트 (0) | 2022.12.16 |
| 자바 스크립트 및 좋은 개발자가 되는 방법. (0) | 2022.12.15 |