app.use()나 app.METHOD() 함수를 사용하여 app 객체의 인스턴스에 Application-level 미들웨어를 바인딩 할 수 있다.
(app.use([path,] callback[, callback...])는 지정된 경로에 지정된 미들웨어 함수를 마운트한다.)
여기서 METHOD는 미들웨어 함수가 처리하는 요청의 HTTP 메소드(get, post 등)을 소문자로 표시한다.
const express = require('express');
const http = require('http');
let app = express();
app.use(function (req, res, next) {
console.log('Time:', Date.now())
next()//다음 미들웨어 실행
})
http.createServer(app).listen(3000, () => { console.log('expresst서버가 3000번 포트에서 시작됨') })
})
이 코드를 nodemon을 이용해 실행시키면 터미널에는
expresst서버가 3000번 포트에서 시작됨
이라고 뜬다.
웹 브라우저에 localhost:3000
번을 입력하면 웹 화면에는 Cannot GET /
이라고 뜨고(html이 없고 웹에 뿌리고 있지 않는다.) 터미널에 Time: 1603014578565
현재시간이 뜬다.
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method)
next()
})
localhost:3000/user/:id
으로 입력하면 화면에는 Cannot GET /user/:id
이라고 뜨고 터미널창에는 Request Type: GET
이라고 뜬다.
const express = require('express');
const http = require('http');
let app = express();
app.use('/user/:id', function (req, res, next) {
res.send('USER')
})
http.createServer(app).listen(3000, () => { console.log('expresst서버가 3000번 포트에서 시작됨') })
이제 localhost:3000/user/:id
를 입력하면 브라우저에 user라는 글이 출력된 것을 확인할 수 있다.
const express = require('express');
const http = require('http');
let app = express();
app.use('/user/:id', function (req, res, next) {
console.log('RequestURL:', req.originalUrl)
next()
}, function (req, res, next) {
console.log('Request Type:', req.method)
next();
})
http.createServer(app).listen(3000, () => { console.log('expresst서버가 3000번 포트에서 시작됨') })
app.use(경로, 미들웨어1, 미들웨어2)와 같다. next()가 있어서 다음 미들웨어를 실행시킬 수 있었다. 터미널창에는 다음과 같이 뜬다.
RequestURL: /user/:id
Request Type: GET
// /user/:id 경로가 처음 실행된다.
app.get('/user/:id', function(req, res, next){
console.log('ID:', req.params.id)
next()
}, function(req, res, next){
res.send('User Info')
//**next()가 없어서 아래 app.get이 실행되지 않는 것인가?
})
// 사용자 ID를 인쇄하는 / user / : id 경로에 대한 핸들러
// 그러나 위에 app.get에서 다음 경로로 요청-응답이 끝났기 때문에
// 이 app은 호출되지 않는다.
app.get('/user/:id', function(req, res, next){
res.end(req.params.id)
})
//app.get(path, callback)함수로 http get 요청을 지정된 경로로 라우팅한다.
첫 번째 app의 미들웨어로 콘솔에는ID: :id
가 뜬다. 두 번째 미들웨어로 웹 화면에 User Info
라는 글이 뜬다. 하지만 두 번째 app에서res.end(req.params.id)는 실행되지 않는다.
/user/:id
경로로 요청-응답을 끝냈기 때문에 두 번째 app이 실행되지 않는다.
const express = require('express');
const http = require('http');
let app = express();
//ready와 set을 출력하는 route
app.get('/user/:id', function (req, res, next) {
console.log('ready')
//다음 route로 건너뛰어 아래 미들웨어는 실행되지 않는다.
next('route');
}, function (req, res, next) {
//response를 보낸다.
console.log('set')
})
// 'go'를 출력하는 / user / : id 경로에 대한 핸들러
app.get('/user/:id', function (req, res, next) {
console.log('go')
})
http.createServer(app).listen(3000, () => { console.log('expresst서버가 3000번 포트에서 시작됨') })
첫 번째 app의 미들웨어에서 ready를 출력한다.
next('route')때문에 아래 미들웨어가 실행 안되고 다음 route인 app.get~이 실행된다.
터미널 출력 결과는 ready go
가 된다.
const express = require('express');
const http = require('http');
let app = express();
//ready와 set을 출력하는 route
function logOriginalUrl(req, res, next) {
console.log('Request URL:', req.originalUrl)
next()
}
function logMethod(req, res, next) {
console.log('Request Type:', req.method)
next()
}
var logStuff = [logOriginalUrl, logMethod]
app.get('/user/:id', logStuff, function (req, res, next) {
res.send('User Info')
})
http.createServer(app).listen(3000, () => { console.log('expresst서버가 3000번 포트에서 시작됨') })
화면에는 'User Info'가 뜬다. 터미널에는 logStuff 배열 순서대로 함수를 실행시킨 결과인 Request URL: /user/:id
Request Type: GET
이 출력된다.
혹시 application-level 이라는 단어의 개념이 어떤 것인지 간단히라도 알 수 있을까요?