Node/복습
Nodejs 복습 21.07.17. 웹 프로그래밍 기초
HappyFrog
2021. 7. 17. 20:37
우선 프로토콜 문서를 따라 작성할 예정이다.
프로토콜문서는 웹서버를 개발할 때 일종의 개발 계획서 또는 개발 기획서 같은 개념이라고 한다.
이전에 수업했던 내용을 토대로 작성해보았다.
이를 바탕으로 로컬 웹 서버를 구축해보자.
우선 VSC를 켜고 사용할 폴더를 만든 다음, 해당 폴더로 경로이동하자.
그리고 npm init -y를 해주고 expresss를 깔아준다. (+nodemon 또는 supervisor는 선택)
const express = require("express");
const app = express();
const moment = require("moment");
const port = 3030;
app.use(express.json());
const customers = [];
app.get("/", (req,res)=>{
res.send("Hello Express!")
});
app.listen(port, ()=>{
console.log(`Server is waiting on ${port} port`);
});
- express를 임포트하고, json을 사용한다. => json은 후에 body내용을 가져오기 위해서 사용한다.
- 그리고 포트 번호를 정한 뒤 서버를 실행한다
그리고 고객이 상품을 구매했을 때와 구매내역 조회를 구현하자.
app.post("/purchases", (req, res) => {
const { userId, goodsId } = req.body;
const date = moment().format("YYYY-MM-DD hh:mm:ss");
if (goodsId === undefined) {
res.status(500).send("구매 상품을 선택해주세요");
} else {
const customer = { userId, goodsId, date };
customers.push(customer);
res.send(`${userId}번 고객이 ${goodsId} 상품을 ${date}에 구입했습니다.`);
}
});
- req.body의 내용을 가져올 때 위에서 선언한 express.json()이 사용된다.
- 그리고 등록을 할 때는 userId와 goodsId를 객체로 가져온다 => 객체로 선언하여 각각의 항목을 가져올 수 있다.
- 단, 항목의 이름과 객체의 이름이 일치해야 한다.
- moment를 통해 작성한 형석(format)으로 등록한 시간을 저장한다.
- 다음으로는 만약 고객의 ID 또는 상품의 ID가 기입되지 않았을 경우, 상품을 구매하지 않았으므로 상태코드 500과 함께 다시 입력해달라는 메시지를 출력한다.
- 만약 제대로 상품을 구매했다면 해당 고객을 구매고객 배열에 추가하고 해당 고객이 어느 상품을 언제 구매했는지를 출력한다.
이제 해당 고객의 정보를 얻어오자.
app.get("/purchases/firsttime", (req, res) => {
const {userId} = req.body;
const result = customers.find((customer) => customer.userId === parseInt(JSON.stringify(userId)));
console.log(result);
if (result === undefined) {
res.status(500).send("잘못된 고객 고유번호입니다.");
} else {
res.send(
`${result.userId}번 고객이 ${result.goodsId} 상품을 ${result.date}에 구매했습니다.`
);
}
});
- 정보를 얻어오고 싶을 때는 get을 사용한다.
- 그리고 기입된 정보(userId)와 일치하는 고객의 정보를 찾아낸다. => 일치하는 한 명만 찾을 수 있다. 검색 결과로는 가장 먼저 등록된 정보가 출력된다.
- 만약 해당 정보가 없다면 상태코드 500과 함께 잘못 검색했다는 메시지를 출력한다.
- 하지만 정상적으로 검색했다면 검색결과를 출력한다.
위에서는 한명만 찾아보았으니 이제 여러명을 결과로 얻어올 수 있게 검색해보자.
app.get("/purchases", (req, res, next) => {
const {userId} = req.body;
const id = JSON.stringify(userId);
if(userId === undefined){
res.send("고유 번호를 입력하세요");
}else{
const results = customers.filter((customers) => customers.userId >= parseInt(id));
if (results.find((result) => result.userId === parseInt(id)) === undefined) {
res.status(500).send("검색 결과가 없습니다.");
} else {
messages = [];
for (let i = 0; i < results.length; i++) {
let message = `${results[i].userId}번 고객이 ${results[i].goodsId} 상품을 ${results[i].date}에 구매했습니다.`;
messages.push(message);
}
res.status(200).send(messages);
}
}
});
- 마찬가지로 검색조건(userId)를 가져온 뒤 filter함수를 사용하여 해당조건에 부합하는 데이터를 모두 출력한다.
- 중간에 message로 string형식으로 변환하여 출력하는 방식을 사용했다.
- 만약 userId를 입력조차 하지 않았다면 상태코드 500과 함께 고유번호를 입력하라고 한다.
- userId가 존재한다면 검색을 하고, 검색결과가 없다면 검색결과가 없다는 메시지를 출력하고
- 있다면 메시지들을 formatting하여 출력한다.
전체코드
const express = require("express");
const app = express();
const port = 3030;
const moment = require("moment");
app.use(express.json());
const customers = [];
let messages = [];
app.get("/purchases/firsttime", (req, res) => {
const {userId} = req.body;
const result = customers.find((customer) => customer.userId === parseInt(JSON.stringify(userId)));
if (result === undefined) {
res.status(500).send("잘못된 고객 고유번호입니다.");
} else {
res.send(
`${result.userId}번 고객이 ${result.goodsId} 상품을 ${result.date}에 구매했습니다.`
);
}
});
app.get("/purchases", (req, res, next) => {
const {userId} = req.body;
const id = JSON.stringify(userId);
if(userId === undefined){
res.status(500).send("고유 번호를 입력하세요");
}else{
const results = customers.filter((customers) => customers.userId >= parseInt(id));
if (results.find((result) => result.userId === parseInt(id)) === undefined) {
res.send("검색 결과가 없습니다.");
} else {
messages = [];
for (let i = 0; i < results.length; i++) {
let message = `${results[i].userId}번 고객이 ${results[i].goodsId} 상품을 ${results[i].date}에 구매했습니다.`;
messages.push(message);
}
res.send(messages);
}
}
});
app.post("/purchases", (req, res) => {
const { userId, goodsId } = req.body;
const date = moment().format("YYYY-MM-DD hh:mm:ss");
if (goodsId === undefined || userId === undefined) {
res.status(500).send("잘못된 형식입니다. 다시 입력해주세요");
} else {
const customer = { userId, goodsId, date };
customers.push(customer);
res.send(`${userId}번 고객이 ${goodsId} 상품을 ${date}에 구입했습니다.`);
}
});
app.listen(port, () => {
console.log(`Server is waiting on ${port} port`);
});
여기까지 웹프로그래밍 기초가 끝났다.
JS는 처음이기도 하고 Node도 거의 안해봐서 잘 모르겠지만 API를 찾아가며 하니 오래걸려도 되긴 되는듯 하다.
어쨋든 코드라서 논리의 영역이기도 하고 그다지 복잡한 과정은 작성하지 않아서 할 만했다.