next()
를 이용해 다음 미들웨어로 현재 요청을 넘길수 있다. 즉, next()
를 통해 미들웨어는 순차적으로 처리됨(순서가 중요함)req
, res
, next
를 가진 함수를 작성하면 해당 함수는 미들웨어로 동작할 수 있다.req
: HTTP 요청을 처리하는 객체res
: HTTP 응답을 처리하는 객체next
: 다음 미들웨어를 실행하는 함수const foo = (req, res, next) => {
console.log("Hello World!!!");
next();
};
const bar = (req, res, next) => {
if (!isAdmin(req)) {
next(new Error("Not Authorized"));
return;
}
next();
};
req
, res
, next
를 인자로 갖는 함수를 작성하면 미들웨어가 된다.req
, res
객체를 통해 HTTP 요청과 응답을 처리하거나 next()
를 통해 다음 미들웨어를 호출해야 한다.next()
함수가 호출되지 않으면 미들웨어 사이클이 멈추기 때문에 주의해야 된다.app.use(express.static());
app.use(express.json());
const express = require("express");
const app = expresss();
const sayHello = function (req, res, next) {
console.log("Hello!!!");
next();
};
app.use(sayHello);
app.get("/", function(req, res) {
res.send("World!!!")
});
sayHello
를 먼저 거치고 sayHello
는 다음 미들웨어 호출next()
함수를 지정하여 res.send("World!!!");
코드가 담긴 미들웨어로 넘어가게 된다는 의미이다.const express = require('express');
const app = express();
const requestTime = function (req, res, next) {
req.requestTime = Date.now();
next();
};
app.use(requestTime);
app.get('/', function (req, res) {
const responseText = 'Hello World!';
responseText += 'Requested at: ' + req.requestTime + '';
res.send(responseText);
});
app.listen(3000);
requestTime
미들웨어는 req
객체 안에 requestTime
이라는 프로퍼티를 만들었고 다음 미들웨어에서 프로퍼티 값을 가져올 수 있다.2. res, req 객체 변경 가능
의 코드는 res.send(responseText);
가 주기를 종료한다는 의미.express()
로 생성할 수 있는 app
객체의 app.use()
나 app.METHOD()
(ex. app.get
, app.post
) 함수를 이용해 미들웨어를 app
인스턴스에 바인딩하는 미들웨어이다. //마운트 경로가 있으며 다음 미들웨어 함수를 호출함
app.get('/pages/', (req, res, next) => {
console.log('Time : ', Date.now());
next();
});
//마운트 경로가 없으며 응답을 여기서 끝냄
app.get((req, res, next) => {
console.log('Not Found');
});
app
여러개의 Methodapp.get('/pages/:id', (req, res, next) => {
//pages id가 0이면 'regular'가 아닌 'special'로 넘어감
if (req.params.id == 0) next('route');
//pages id가 0이 아니라면 'regular'로 넘어감
else next();
}, (req, res, next) => {
res.send('regular');
}
});
//pages id가 0일 때 넘어올 미들웨어
app.get('/pages/:id', (req, res, next) => {
res.send('special');
}
이 경우 위에 미들웨어가 2개 묶인 app METHOD가 위에 있으므로 일단 special보다 더 먼저 실행된다.
next('route')는 지금 라우터 미들웨어 스택을 벗어난 다음 라우터(special)로 제어가 넘어가게 하는 것이다. 라우터 미들웨어 스택이란 하나의 app.use()나 app.METHOD()에 묶인 라우팅 미들웨어들을 말한다. 여기서는 if-else 절이 든 미들웨어와 regular 미들웨어가 한 스택에 같이 있다고 할 수 있다.
여기서 그냥 next()는 regular로 넘어가게 된다. id가 0이 아니라서 regular로 넘어간다면, 거기서 next()를 호출하지 않았으므로 special은 호출되지 않는다.
next() 안에 인자가 들어가는 경우는 아마 next('route')와 next(err)뿐.
next 안에 뭔가 인자가 들어가면 express 앱은 그것을 오류 발생이라고 보고 오류 처리와 관련없는 다른 모든 미들웨어를 다 건너뛰고 오류 처리(error handling) 라우터로 넘어간다. 단 하나 'route'만 빼고 말이다. 'route'는 현재 메소드를 벗어나 path에 해당하는 다음 라우터로 제어가 넘어가는 것이다.
//app.js
const express = require('express');
const app = express();
const pageRouter = ('./routes/pages');
app.use('/pages', pageRouter);
//pages.js
const express = require('express');
const router = express.Router();
router.get('/pages/:id', (req, res, next) => {
//pages id가 0이면 'regular'가 아닌 'special'로 넘어감
if (req.params.id == 0) next('route');
//pages id가 0이 아니라면 'regular'로 넘어감
else next();
}, (req, res, next) => {
res.send('regular');
}
});
//pages id가 0일 때 넘어올 미들웨어
router.get('/pages/:id', (req, res, next) => {
res.send('special');
}
module.exports = router;
//오류의 종류에 상관없이 모든 오류를 잡는 미들웨어
app.get((err, req, res, next) => {
console.log(err.stack);
res.status(500).send('Something broke!');
});
app.get('/pages/:id', (req, res, next) => {
if (!req.params.id) next(err);
});
app.use(express.static(__dirname + '/public'));
> npm i cookie-parser
const express = require('express');
const app = express();
const cookieParser = require('cookie-parser');
app.use(cookieParser());