[express] 미들웨어(+ 에러핸들링)
본문 바로가기

Backend/node.js

[express] 미들웨어(+ 에러핸들링)

1. 미들웨어

여러개 함수들이 연속적으로 이어서 동작하는 것. express 를 잘활용하는 첫걸음!

각 함수들이 미들웨어라 한다. router도 하나의 미들웨어

 

기초

 

next라는 인자를 받아서 next()를 실행해야만 그다음 미들웨어가 출력된다.

//@ts-check

/* eslint-disable no-console */

const express = require('express')

const app = express()

// routing
app.use('/',(req, res, next)=>{
    res.send('hello,express!')
    console.log('middleware1')
    // setTimeout(()=>{
        next() //next()실행을하지않으면 계속 middleware1이 실행중
    // },1000)
},(req,res,next)=>{
    console.log('middleware 1-2')
    next()
}
)


app.use((req,res)=>{
    console.log('middleware2')
})


const PORT = 5000
app.listen(PORT,()=>{
    console.log(`The express server is listening at prot: ${PORT}`)
})

실행결과

middleware 1 -> 1-2 -> 2

 

미들웨어 사용법

만약 미들웨어1의 변수를 미들웨어2에 넘기고싶을때

//@ts-check

/* eslint-disable no-console */

const express = require('express')

const app = express()

// routing
app.use('/',(req, res, next)=>{
    // res.send('hello,express!')
    console.log('middleware1')
    const requestedAt = new Date()
    //@ts-ignore
    req.requestedAt = requestedAt
    // setTimeout(()=>{
        next() //next()실행을하지않으면 계속 middleware1이 실행중
    // },1000)
}
)


app.use((req,res)=>{
    console.log('middleware2')
    //@ts-ignore
    res.send(`${req.requestedAt}`)
})

// app.get('/', (req,res)=>{
//     res.send('GET')
// })

// app.post('/',(req,res)=>{
//     res.send('POST')
// })


const PORT = 5000
app.listen(PORT,()=>{
    console.log(`The express server is listening at prot: ${PORT}`)
})

 

비동기작업에서의 미들웨어

노드js는 모든것이 비동기작업으로 이루어지므로 미들웨어 활용방법을 잘 숙지해두자

//@ts-check

/* eslint-disable no-console */

const express = require('express')
const fs = require('fs')

const app = express()

// routing
app.use('/', async(req, res, next)=>{
    console.log('middleware1')
    const fileContent = await fs.promises.readFile('.gitignore')
    //@ts-ignore
    req.fileContent = fileContent
        next() //next()실행을하지않으면 계속 middleware1이 실행중
}
)

app.use((req,res)=>{
    console.log('middleware2')
    //@ts-ignore
    res.send(`${req.fileContent}`)
})

const PORT = 5000
app.listen(PORT,()=>{
    console.log(`The express server is listening at prot: ${PORT}`)
})

 

 

GitHub - LeeEugene1/fastcampus_express_basic: node todo app

node todo app. Contribute to LeeEugene1/fastcampus_express_basic development by creating an account on GitHub.

github.com

 

---

 

추가

에러핸들링 미들웨어활용

user.js

//param collback id를 넘겨받으면 어떻게 처리해라~
router.param('id',(req, res, next, value)=>{
    //@ts-ignore
    const user = USERS[value]

    if(!user){
        const err = new Error('User not found')
        err.statusCode = 404
        throw err
        // res.send('에러핸들링은 미들웨어를 통해 main.js에서 구현가능')
    }

    req.user = user
    next()
})

main.js

// 에러핸들링 미들웨어, express는 위의 코드로인하여 4개 인자값을 받으면 자동으로 에러로 인식
app.use((err, req, res, next)=>{
    res.statusCode = err.statusCode || 500
    res.send(err.message)
})

 

만약  에러 핸들링에도 비동기를 적용하고싶다면 async를 하되 try catch문으로 감싸줘야 계속 로딩뜨는 문제가 해결된다.

//param collback id를 넘겨받으면 어떻게 처리해라~
router.param('id',async(req, res, next, value)=>{
    try{
        //@ts-ignore
        const user = USERS[value]

        if(!user){
            const err = new Error('User not found')
            err.statusCode = 404
            throw err
            // res.send('에러핸들링은 미들웨어를 통해 main.js에서 구현가능')
        }

        req.user = user
        next()
    }catch(err){
        next(err)
    }

})
반응형