728x90
Node.js 숙련 1주차_1
todo-memo 프로젝트
📌 package.json 생성
npm init -y
📌 express 설치
npm install express
📌 mongoose 설치
npm install mongoose
📄 app.js
const express = require("express");
const app = express();
const router = express.Router();
router.get("/", (req, res) => {
res.send("Hi!");
});
// post, put 메소드 사용시 body로 들어오는 데이터
// 사용할 수 있도록 하는 미들웨어
app.use("/api", express.json(), router);
app.listen(8080, () => {
console.log("서버가 켜졌어요!");
});
app.use, express.json()은 미들웨어로 router로 이어짐!
건너건너 접근!
/api 경로로 접근하면 결국 router로 연결됨.
front(React) & mongoose 연결
📌 assets파일
📄 app.js
// app.js
const express = require("express");
const db = require("./models/index.js");
const todosRouter = require("./routes/todos.router.js");
const app = express();
app.use("/api", express.json(), todosRouter);
app.use(express.static("./assets"));
app.listen(8080, () => {
console.log("서버가 켜졌어요!");
});
assets 파일을 서빙할 수 있도록 static 미들웨어를 추가!
📄 models/index.js
// models/index.js
const mongoose = require("mongoose");
// localhost의 27017 포트 번호로 MongoDB와 연결합니다.
// Database Name은 todo-demo 입니다.
mongoose.set('strictQuery', true);
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:"));
module.exports = db;
📄 기존 코드
// localhost의 27017 포트 번호로 MongoDB와 연결합니다.
// Database Name은 todo-demo 입니다.
mongoose.connect("mongodb://localhost:27017/todo-demo", {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(value => console.log("MongoDB 연결에 성공하였습니다."))
.catch(reason => console.log("MongoDB 연결에 실패하였습니다."))
📄 에러 발생해 코드 추가!
// localhost의 27017 포트 번호로 MongoDB와 연결합니다.
// Database Name은 todo-demo 입니다.
mongoose.set('strictQuery', true);
mongoose.connect("mongodb://127.0.0.1:27017/todo-demo", {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(value => console.log("MongoDB 연결에 성공하였습니다."))
.catch(reason => console.log("MongoDB 연결에 실패하였습니다."))
📌 mogoDB 연결 성공
Todo List 할 일 추가
📄 models/todo.js
const mongoose = require("mongoose");
const TodoSchema = new mongoose.Schema({
value: String, // 할 일이 어떤것인지 확인하는 칼럼
doneAt: Date, // 할 일이 언제 완료되었는지
order: Number, // 몇 번째 할 일인지
});
// mongoose의 _id를 가상의 컬럼(todoId)로 만들어서 사용자들에게 보여줌.
TodoSchema.virtual("todoId").get(function (){
return this._id.toHexString();
});
TodoSchema.set("toJSON", {virtuals: true})
module.exports = mongoose.model("Todo", TodoSchema);
todoId는 studio3T에는 없고 express서버에서만 있는 가상의 칼럼!
📄 routers/todo.router.js
const Todo = require("../models/todo.js");
// 할 일 추가
router.post("/todos", async(req, res) => {
const {value} = req.body;
const maxOrderByUserId = await Todo.findOne().sort("-order").exec();
const order = maxOrderByUserId ?
maxOrderByUserId.order + 1 : // maxOrderByUserId 있을 때
1; // maxOrderByUserId 없을 때
const todo = new Todo({value, order});
await todo.save();
return res.send({todo}); // 마지막이라 return 필요 없음.
})
db에는 todoId는 없는 상태인 걸 확인 할 수 있다.
Todo List 할 일 목록 가져오기
📄 routes/todos.router.js
// 할 일 목록 조회
router.get("/todos", async(req,res) => {
const todos = await Todo.find().sort("-order").exec();
res.send({todos});
})
할 일 목록 내림차순으로 조회
Todo List 할 일 순서 변경하기
📄 routes/todos.router.js
// 할 일 목록
router.patch("/todos/:todoId", async(req,res) => {
const {todoId} = req.params;
const {order} = req.body;
// todoId에 해당하는 할 일이 있는가?
// todoId에 해당하는 할 일이 없으면, 에러 출력
const currentTodo = await Todo.findById(todoId);
if(!currentTodo) {
return res.status(400).json({"errorMessage": "존재하지 않는 할 일입니다."});
}
// order, value, done
if(order) {
const targetTodo = await Todo.findOne({order:order}).exec();
if(targetTodo) {
// 2 -> 1
targetTodo.order = currentTodo.order;
await targetTodo.save();
}
// 1 -> 2
currentTodo.order = order;
await currentTodo.save();
}
res.send();
});
'JavaScript' 카테고리의 다른 글
Node.js 숙련 1주차_3 (0) | 2022.12.20 |
---|---|
Node.js 숙련 1주차_2 (0) | 2022.12.19 |
Node.js 입문 1주차, 개인과제 (0) | 2022.12.16 |
Node.js 입문 주차 1주차_5 (0) | 2022.12.14 |
Node.js 입문 주차 1주차_4 (0) | 2022.12.14 |