Express로 구현한 서버와 http 모듈로 작성한 서버의 차이
- 미들웨어 추가가 편리
- 자체 라우터를 제공
npm install express --save
: myapp 디렉토리에 Express를 설치한 후 종속 항목 목록에 저장
npm install express
: Express를 임시로 설치하고 종속 항목 목록에 추가하지 않으려면 --save 옵션을 생략
const express = require('express')
const app = express()
const port = 5000
const ip = "localhost"
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`http server listen on ${ip}:${port}`)
})
자주 사용하는 미들웨어
- 모든 요청에 대해 url이나 메소드를 확인할 때
- POST 요청 등에 포함된 body(payload)를 구조화할 때(쉽게 얻어내고자 할 때)
- 모든 요청/응답에 CORS 헤더를 붙여야 할 때
- 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때
const myLogger = function (req, res, next) {
console.log(`http request method is ${req.method}, url is ${req.url}`)
next()
// next() : 그 다음 미들웨어 함수가 호출되며 없으면 다음 미들웨어로 넘어가지 않음
}
app.use(myLogger)
morgan 모듈을 사용하여 console.log 출력 가능
const morgan = require("morgan") app.use(morgan("http request method is :method")) // http request method is POST, http request url is /upper app.use(morgan("dev")) // POST /upper 201 19.535 ms - 4
app.use(express.json({ strict: false }))
// string 등 원시타입 데이터도 json parsing 해주도록 설정
app.post("/upper", (req, res) => {
res.status(201).json(req.body.toUpperCase())
// 상태 코드 : 201
// req.body에는 JSON의 형태로 payload가 담겨져 있는데, 여기에 toUpperCase()하여 json으로 응답으로 보냄
});
res.send()
: send에 전해진 argument에 따라서 Content-type이 자동적으로 만들어짐res.json()
: json이 아닌 것도 json 형식으로 바꾸어서 보내줌app.use(express.urlencoded({extended: ture}))
: 객체 형태로 전달된 데이터내에서 또다른 중첩된 객체를 허용const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
}
if (req.method === 'OPTIONS') {
res.writeHead(201, defaultCorsHeader)
res.end()
}
npm i cors
const cors = require('cors')
const corsOptions = {
origin: "*",
methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
allowedHeaders: ["Content-Type", "Accept"],
maxAge: 10,
}
app.use(cors(corsOptions))
// 정해진 cors 설정만 허용
app.use(cors())
// 모든 요청에 대해 CORS 허용
app.use((req, res, next) => {
// 토큰이 없으면 받아줄 수 없음
if(req.headers.token){
req.isLoggedIn = true;
next()
} else {
res.status(400).send('invalid user')
}
})
const requestHandler = (req, res) => {
if(req.url === '/upper') {
if (req.method === 'GET') {
res.end(data)
} else if (req.method === 'POST') {
req.on('data', (req, res) => {
// do something ...
})
}
}
}
// upper.js
const express = require("express")
const router = express.Router()
router.post("/", function (req, res) {
res.status(201).json(req.body.toUpperCase())
})
module.exports = router
// express-server.js
const upper = require("./router/upper");
// upper.js의 경로 지정
app.use("/upper", upper);
// url이 /upper일 때