수업 복습/Node.js

10월 31일 수업 내용 - Node.js / Day03

김복칠 2023. 10. 31. 15:14

1. express 활용

import express from 'express'

// 객체 생성
const app = express()

app.get('/', (req,res,next) => {
    res.send('<h2>익스프레스 서버로 만든 첫번째 페이지</h2>')
})

app.get('/hello',(req,res,next)=>{
    res.setHeader('Content-Type','application/json')
    res.status(200).json({name:'apple',age:20})
})

// 미들웨어
// next : 다음 미들웨어를 호출
app.use((req,res,next)=>{
    res.setHeader('node-skill','node middleware!')
    next() // 미들웨어 다음으로 제어권을 넘김
})

app.use((req,res) => {
    res.send('<h2>not found</h2>')
})

// 서버 실행
app.listen(8080)

 

2. get 활용

import express from 'express'

const app = express()

// lcoalhost:8080/posts
// lcoalhost:8080/posts?number=1
// lcoalhost:8080/posts?number=1&userid=apple
app.get('/posts',(req,res)=>{
    console.log('posts를 호출');
    console.log('path:',req.path);
    console.log('query:',req.query);    // query => 'path ?' 뒤에 딕셔너리 형태로 위치함
    res.sendStatus(200)
})

// laoclhost:8080/posts/1
app.get('/posts/:id',(req,res)=>{
    console.log('/posts/:id 호출');
    console.log('path:',req.path);
    console.log('params:',req.params);  // params => 'path /' 뒤에 딕셔너리 형태로 위치함
    res.sendStatus(200)
})

app.get(['/mypage','/myroom'],(req,res)=>{
    res.send('<h2>mypage 겸 myroom 페이지</h2>')
})

app.get('/member/:id',(req,res)=>{
    console.log('/member/id 호출!');
    console.log(req.path,'호출!');
    console.log(req.params['id'],'번 멤버가 출력됨!');
    console.log(req.params.id,'번 멤버가 출력됨!');
    console.log(`${req.params.id}번 멤버가 출력됨!`);
    res.sendStatus(200)
})

app.post('/posts',(req,res)=>{
    console.log('post 메서드로 posts를 호출');
    console.log('path:',req.path);
    res.sendStatus(200)
})

app.listen(8080)

 

3. post 활용

import express from 'express'

const app = express()

app.use(express.json())
app.post('/posts',(req,res)=>{
    console.log(req.body);
    res.status(201).send('새로 글이 등록되었습니다')
})

app.listen(8080)

 

4. error 활용

import express from 'express'
import fs from 'fs'
import fsAsync from 'fs/promises'

// localhost:8080/file1
const app = express()
app.use(express.json())
app.get('/file1',(req,res)=>{
    fs.readFile('/file1.txt',(err, data)=>{
        if(err){
            res.sendStatus(404)
        }
    })
})

// localhost:8080/file2
// file2를 읽어 에러가 발생하면 404를 리턴
// 단, file2를 읽을 경우 동기식으로 작성
app.get('/file2',(req,res)=>{
    try{
        const data = fs.readFileSync('/file2.txt')
    }catch(error){
        res.sendStatus(404)
    }  
})

app.get('/file3',(req,res)=>{
    fsAsync.readFile('/file3.txt').catch((error) => {res.sendStatus(404)})
})

// async ~ await : 비동기 프로그래밍에서 async 함수내에서 Promise를 처리할 때 사용. await를 사용하면 프로그램은 Promise가 완료될 때까지 기다리며 그 후 비동기 작업의 결과를 반환하거나 처리
app.get('/file4',async(req,res)=>{
    try{
        const data = await fsAsync.readFile('/file4.txt')
    }catch{
        res.sendStatus(404)
    }
})

app.use((req,res,next)=>{
    const error = new Error('테스트 에러')
    next(error)
})

app.use((error,req,res,next) => {
    console.error(error)
    res.status(500).json({message:'서버에러'})
})

app.listen(8080)

 

5. routing 활용 -1 

import express from 'express'

const app = express() 

app
    .route('/posts')
    .get((req,res)=>{
        res.status(200).send('GET : /posts')
    })
    .post((req,res)=>{
        res.status(200).send('POST : /posts')
    })

app
    .route('/member/:id')
    .put((req,res)=>{
        res.status(201).send('PUT : /member/:id')
    })
    .delete((req,res)=>{
        res.status(200).send('DELETE : /member/:id')
    })

app.listen(8080)

 

 

6.routing 활용 -2

<메인 js 페이지>
import express from 'express'
import userRouter from './routes/user.js'
import postRouter from './routes/post.js'
import morgan from 'morgan'

const app = express()

app.use(express.json())
// common, combined, dev, short
app.use(morgan('dev'))

app.use('/users',userRouter)
app.use('/posts',postRouter)
 
app.listen(8080)

------------------------------------------------------------------------
<서브 js 페이지 - user.js>
import express from 'express'

const router = express.Router()

router.use((req,res,next)=>{
    console.log('posts에 존재하는 미들웨어');
    next()
})

router.get('/',(req,res)=>{
    res.status(200).send('GET : /posts')
})

router.post('/',(req,res)=>{
    res.status(200).send('POST : 글작성')
})

router.put('/:id',(req,res)=>{
    res.status(200).send('PUT : 글수정')
    console.log(req.params);
})

router.delete('/:id',(req,res)=>{
    res.status(200).send('DELETE : 글삭제')
    console.log(req.path);
})

export default router

======================================================================================
<서브 js 페이지 - post.js>
import express from 'express'

const router = express.Router()

router.use((req,res,next)=>{
    console.log('users에 존재하는 미들웨어');
    next()
})

// 회원정보보기
router.get("/",(req,res)=>{
    res.status(200).send('GET: /users')
})
router.get("/member",(req,res)=>{
    res.status(200).send('GET: /member')
})

// 회원가입
router.post("/",(req,res)=>{
    res.status(201).send('POST: /users')
})

// 정보수정 
router.put("/:id",(req,res)=>{
    res.status(201).send('PUT: /users/:id')
    console.log(req.path);
})

// 회원탈퇴 
router.delete("/:id",(req,res)=>{
    res.status(201).send('DELETE: /users/:id')
    console.log(req.path);
    console.log(req.params);
})

export default router