#TIL CRUD 코드 분석

송정석·2022년 3월 21일
0

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번 포트로 스타트 및 메시지 리턴
profile
Foot print

0개의 댓글