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}`)
})
---
추가
에러핸들링 미들웨어활용
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)
}
})
반응형
'Backend > node.js' 카테고리의 다른 글
body-parser의 필요성(undefined 에러 해결) (0) | 2021.09.22 |
---|---|
[express] pug 설치 및 사용방법(템플릿 그리기) (0) | 2021.09.17 |
[node.js] express 설치와 환경세팅 (0) | 2021.09.04 |
[node.js] 간단한 데이터베이스만들기(JSON) (0) | 2021.09.04 |
[nodejs] 간단한 restfulAPI 서버만들기3 - 코드개선(추상화), 리펙토링 (0) | 2021.09.01 |