Routing이란 클라이언트의 요청에 어떻게 응답할 것인지 어플리케이션의 endpoint들(URI)을 정의하는것을 말합니다.
Routing을 정의하기 위해서는 Express의 app
객체를 이용해서 정의할 수 있는데 다음과 같은 것들이 필요합니다.
// GET method route
app.get('/', function (req, res) {
res.send('GET request to the homepage')
})
// POST method route
app.post('/', function (req, res) {
res.send('POST request to the homepage')
})
위의 예는 GET과 POST의 예입니다. Express
는 HTTP method들을 모두 지원합니다.
지원하는 모든 method들은 app.METHOD를 참고해주세요.
추가로 app.all()
이라는 method도 존재하는데 이는 모둔 HTTP method에 응답합니다.
app.all('/secret', function (req, res, next) {
console.log('Accessing the secret section ...')
next() // pass control to the next handler
})
위의 예는 /secret
endpoint에 모든 GET, POST, PUT, DELETE에 응답합니다.
Express
는 route path를 match할 때 path-to-regexp를 사용합니다.다음과 같이 단순한 string으로 작성할 수 있습니다.
app.get('/', function (req, res) {
res.send('root')
})
app.get('/about', function (req, res) {
res.send('about')
})
/random.text
로 요청시에 Route path는 다음과같이 작성합니다.
app.get('/random.text', function (req, res) {
res.send('random.text')
})
/acd
와 /abcd
에 대해 응답하는 Route path입니다.
app.get('/ab?cd', function (req, res) {
res.send('ab?cd')
})
다음은 /abcd, /abbcd, /abbbcd
… 에 대해 응답하는 path입니다.
app.get('/ab+cd', function (req, res) {
res.send('ab+cd')
})
다음은 /abcd, /abxcd, /abRANDOMcd, ab123cd
… 에 대해 응답하는 path입니다.
app.get('/ab*cd', function (req, res) {
res.send('ab*cd')
})
다음은 /abe
와 /abcde
에 대해 응답하는 path입니다.
app.get('/ab(cd)?e', function (req, res) {
res.send('ab(cd)?e')
})
Regular expression을 사용하였을 때 다음은 a
가 들어간 endpoint는 모두 일치하여 응답합니다.
app.get(/a/, function (req, res) {
res.send('/a/')
})
다음은 butterfloy
와 dragonfly
은 응답하지만 butterflyman
와 dragonflyman
은 응답하지 않습니다.
app.get(/.*fly$/, function (req, res) {
res.send('/.*fly$/')
})
req.params
에 파라미터의 이름과 함께 저장이 됩니다./users/:userId/books/:bookId
이고 요청한 URL이 http://localhost:3000/users/34/books/8989
이면 req.params의 값은 { "userId": "34", "bookId": "8989" }
가 됩니다.Route path는 다음과 같이 작성할 수 있습니다.
app.get('/users/:userId/books/:bookId', function (req, res) {
res.send(req.params)
})
[A-Za-z0-9_]
만 가능합니다./flights/:from-:to
이고 요청한 URL이 http://localhost:3000/flights/LAX-SFO
이면 req.params의 값은 { "from": "LAX", "to": "SFO" }
가 됩니다./plantae/:genus.:species
이고 요청한 URL이 http://localhost:3000/plantae/Prunus.persica
이면 req.params의 값은 { "genus": "Prunus", "species": "persica" }
가 됩니다./user/:userId(\d+)
이고 요청한 URL이 http://localhost:3000/user/42
이면 req.params의 값은 {"userId": "42"}
가 됩니다.하나의 callback함수만 등록할 경우 다음과 같이 작성합니다.
app.get('/example/a', function (req, res) {
res.send('Hello from A!')
})
여러개의 callback함수를 등록할 경우 다음과 같이 작성합니다.
app.get('/example/b', function (req, res, next) {
console.log('the response will be sent by the next function ...')
next()
}, function (req, res) {
res.send('Hello from B!')
})
혹은 callback으로 함수들의 배열을 입력할 수 있습니다.
var cb0 = function (req, res, next) {
console.log('CB0')
next()
}
var cb1 = function (req, res, next) {
console.log('CB1')
next()
}
var cb2 = function (req, res) {
res.send('Hello from C!')
}
app.get('/example/c', [cb0, cb1, cb2])
혹은 배열과 함수를 동시에 같이 입력할 수도 있습니다.
var cb0 = function (req, res, next) {
console.log('CB0')
next()
}
var cb1 = function (req, res, next) {
console.log('CB1')
next()
}
app.get('/example/d', [cb0, cb1], function (req, res, next) {
console.log('the response will be sent by the next function ...')
next()
}, function (req, res) {
res.send('Hello from D!')
})
res
object가 가지고 있는 메소드들 입니다.
Method|Description
——|——
res.download() | Prompt a file to be downloaded.
res.res.end() |End the response process.
res.res.json() |Send a JSON response.
res.res.jsonp() |Send a JSON response with JSONP support.
res.res.redirect()| Redirect a request.
res.res.render()| Render a view template.
res.res.send() |Send a response of various types.
res.res.sendFile() |Send a file as an octet stream.
res.res.sendStatus() |Set the response status code and send its string representation as the response body.app.route('/book')
.get(function (req, res) {
res.send('Get a random book')
})
.post(function (req, res) {
res.send('Add a book')
})
.put(function (req, res) {
res.send('Update the book')
})
Router
는 routing시스템의 미들웨어입니다.Router
를 통해 모듈러하고 mountable한 route handler를 작성할 수 있습니다.birds.js
라는 router파일을 만들고 다음과같이 작성합니다.
var express = require('express')
var router = express.Router()
// middleware that is specific to this router
router.use(function timeLog (req, res, next) {
console.log('Time: ', Date.now())
next()
})
// define the home page route
router.get('/', function (req, res) {
res.send('Birds home page')
})
// define the about route
router.get('/about', function (req, res) {
res.send('About birds')
})
module.exports = router
그리고 app에서 모듈을 로드합니다.
var birds = require('./birds')
// ...
app.use('/birds', birds)
이제 응용 프로그램은 /birds
/about에
대한 요청을 처리 할 수있을뿐 아니라 경로와 관련된 timeLog
미들웨어 기능을 호출 할 수 있습니다.
자바스크립트로 직접 만들면서 배우는 - 자료구조와 알고리즘 강의 바로 가기
실습으로 마스터하는 OAuth 2.0: 기본부터 보안 위험까지 - OAuth 2.0 강의 바로 가기
기계인간 이종립, 소프트웨어 개발의 지혜 - Git 강의 바로 가기
코드숨에서 매주 스터디를 진행하고 있습니다. 메일을 등록하시면 새로운 스터디가 시작될 때 알려드릴게요!