node js 로 구성 된 Backend 처리 방법 기술
try catch try에서 선언된 에러 발생시 해당 내용 리턴 해주며 선언되지 않은 에러 발생시 catch문에서 status에 코드 에러 발생을 알려줌
async await 동기 비동기 참조
prisma.$queryRaw` ORM프리즈마 문법으로 프리즈마를 사용해서 로우쿼리를 입력 DB에서 불러 온다
const http = require('http') const express = require('express') // express 사용 선언 const { PrismaClient } = require('@prisma/client') // prisma 사용 선언 const { apple } = require('color-convert') const { userInfo } = require('os') const bcrypt = require('bcrypt') // bcrypt 사용 선언 cosnt jwt = require('jsonwebtoken') // jwt 사용 선언
const prisma = new PrismaClient() // new prisma 사용 선언 const app = express() // 기본구문 app.use(express.json()) app.get('/', (req, res) => { res.json({ message: '/ endpoint' }) }) // endpoint 내용 솔출
// 음료 카테고리 조회 // app.get('/products/categories', async (req, res) => { try { const Categories = await prisma.$queryRaw`select id, name from categories;` return res.status(200).json(Categories) } catch (err) { console.log(err); return res.status(500).json({ message: err.message }) } }) //app.get으로 서버에서 받아 async req,res에서 용도에 맞게 선택 //try catch문으로 선언한 에러 외의 발생되는 에러는 500으로 넘겨서 메세지에 보여줌
// 음료 리스트 // app.get('/products', async (req, res) => { try { const products = await prisma.$queryRaw` select id, koreanname, englishname from products;` return res.status(200).json(products) } catch (err) { console.log(err); return res.status(500).json({ message: err.message }) } }) //app.get으로 서버에서 받아 async req,res에서 용도에 맞게 선택 //try catch문으로 선언한 에러 외의 발생되는 에러는 500으로 넘겨서 메세지에 보여줌
// 음료 상세 정보 // // app.get('/products/2', async (req, res) => { // try { // // res.json({ message: ' /categories ' }) // const products2 = await prisma.$queryRaw` // select id, name from categoriesSELECT products.id, products.korean_name AS "koreanName", products.english_name AS "englishName", // product_images.image_url AS "imageURL", categories.name AS "category", categories.id AS "categoryId" // FROM products // JOIN product_images ON product_images.product_id = products.id // JOIN categories ON categories.id = products.category_id;` // // return res.status(201).json({ message: "select success" }) // return res.status(200).json(products2) // } catch (err) { // console.log(err); // return res.status(500).json({ message: err.message }) // } // }) // 쿼리문 조인으로 불러와야하나 실패로 분석 보류
// 비번 변경 // app.post('/users', async (req, res) => { try { const { email, password } = req.body console.log('email = ', email, 'password: ', password) const updatePassword = await prisma.$queryRaw` update users set password=${password} where email=${email};` return res.status(201).json({ message: "UPDATE SUCCESS" }) } catch (err) { console.log(err) return res.status(500).json({ message: err.message }) } }) // post에서 받아온 body 내용의 email,password 를 update문을 이용해서 변경 // 변경 완료시 200 상태값과 update success 리턴 그외에 발생하는 에러는 캐치문이 담당
// 유저 조회 // app.get('/users', async (req, res) => { try { const Users = await prisma.$queryRaw`select * from users;` return res.status(200).json(Users) } catch (err) { console.log(err); return res.status(500).json({ message: err.message }) } }) // post로 쿼리문 사용해서 유저 목록 조회
// 회원 가입 // app.post('/user/signup', async (req, res) => { try { const { email, password } = req.body if (!email || !password) { const error = new Error('KEY_ERROR') error.statuscode = 400 throw error } // body에서 email, password를 받아와서 둘중 하나라도 입력 안됬다면 KEY ERROR 메세지 발생 및 // status 400코드를 throw로 catch에 던져줘서 메시지 발생 if (password.length < 8) { const error = new Error("PASSWORD_TOO_SHORT") error.statuscode = 400 throw error } // body에서 받아온 password의 길이가 8보다 낮으면 에러 발생시킴 const Users = await prisma.$queryRaw` select id from users where email = ${email};` // Users에 쿼리문을 사용해서 방금 가입할려고한 사용자가 기존에 있는 이메일인지 검사 if (Users.length !== 0) { const error = new Error("EXSITING_USER") error.statuscode = 409 throw error } // Users에 미리 email의 id를 확인하고 빈배열 즉 0이 아니라면 // 기존에 있던 사용자임을 메세지 발생 시켜 같은 메일로 가입 불가 const encryptedPW = bcrypt.hashSync(password, bcrypt.genSaltSync()) // bcrypt로 암호화 시켜서 아래로 전달 await prisma.$queryRaw` insert into users(email,password) VALUES (${email}, ${encryptedPW});` return res.status(201).json({ message: "SIGNUP_SUCCESS" }) // 바디에서 받아온 이메일과 암호화한 비밀번호로 DB 생성 시키고 SIGNUP 메시지 리턴 } catch (err) { console.log(err) return res.status(error.statuscode || 500).json({ message: err.message }) } })
// 로그인 // app.post('/user/login', async (req, res) => { try { const { email, pw } = req.body if (!email || !pw) { const error = new Error('KEY_ERROR') error.statuscode = 400 throw error } // 회원가입과 동일 const Users = await prisma.$queryRaw` select id, password from users where email = ${email};` // 회원가입과 동일 if (Users.length === 0) { const error = new Error("INVALID_USER") error.statuscode = 400 throw error } // Users에 미리 email의 id를 확인하고 빈배열 즉 0이면 // 기존 사용자가 아님의 메세지 발송하고 로그인 불가 const isCorrect = bcrypt.compareSync(pw, Users[0].password) // bcrypt로 Compare 해서 두 비번을 비교 해서 같으면 TRUE, 다르면 FALSE 리턴 if (!isCorrect) { const error = new Error('INVALID_USER') error.statuscode = 400 throw error } // isCorrect가 FALSE 일때 에러 발생 const token = jwt.sign({ userID: Users[0].id }, process.env.SECRET_KEY) // 회사 교유의 secret 키는 아무나 확인하면 안되기 때문에 .env에 저장해둠 // 토큰은 브라우저에서 알아서 캐쉬에 저장 return res.status(200).json({ messge: 'LOGIN_SUCESS', jwt: token }) } catch (err) { console.log(err) return res.status(error.statuscode || 500).json({ message: err.message }) } })
const server = http.createServer(app) server.listen(8000, () => { console.log('server is listening on PORT 8000') }) // 서버 8000번 포트로 스타트 및 메시지 리턴