app.use(['실행될 특정 url'](req, res, next) => {
모든 요청에 실행하고 싶은 코드;
next();
})
코드의 req부터 next까지의 함수를 미들웨어라고 부른다. 이 미들웨어를 use에 장착했다고 생각하면 더 편하다. (use 자체가 미들웨어 ❌)
미들웨어에 작성한 코드는 모든 라우터(메소드와 주소가 있는 것)에서 다 실행된다. express는 기본적으로 위에서 아래로 코드가 실행되지만, 미들웨어는 next()를 반드시 해 줘야만 다음 코드로 넘어간다.
이때 next는 반드시 다음 라우터가 실행된다는 의미가 아니라 순서는 아래로 향하되 요청에 따른 응답을 한다. 만약 next 다음에 와일드카드 라우터가 있을 경우 예상 외의 결과가 발생할 수도 있기 때문에(와일드 카드 라우터보다 아래에 있는 라우터 대신 실행된다는 등) 와일드카드 라우터나 범위가 넓은 라우터들은 라우터의 가장 아래에 둔다.
express는 에러가 발생했을 경우 기본적으로 에러 처리를 해 주지만 노출되는 에러문 구가 보안상 문제될 수도 있기 때문에 따로 에러 처리를 해 준다. 에러 처리 역시 미들웨어다.
app.use((err, req, res, next) => {
console.error(err);
res.[status(500).]send('에러 메시지');
})
에러 미들웨어는 반드시 err
, req
, res
, next
네 개의 매개변수를 모두 작성해야 한다. next
가 빠지게 되면 아예 다른 함수로 인지한다. res 뒤에는 기본값으로 .status(200)
이 생략되어 있기 때문에 따로 status 값을 지정해 주지 않으면 클라이언트 상에서는 200 코드가 뜬다. 즉, 에러가 아니라고 뜬다. 에러 코드는 오히려 보안상 문제가 일어날 수 있어서🙄 실무에서는 보통 200번대 위주로 사용한다고 한다. 에러 코드는 조심해서 사용할 것.
404 에러의 경우 라우터들 최하단, 에러 미들웨어 위에 새로운 미들웨어를 만들어 404 에러 처리 미들웨어로 사용할 수 있다. 이 경우 에러는 아니고 404 처리 미들웨어 정도로 생각하면 된다.
app.use((req, res, next) => {
res.[status(404).]send('404 error');
next();
})
app.use('/', express.static(path.join(__dirname, 'public')));
// app.use('요청 경로', express.static(path.join('실제 경로')));
static 미들웨어는 정적인 파일들(css, html, js)를 처리할 때 사용된다. 요청 경로와 실제 경로는 다르다.
예를 들어, localhost:3000/bin-lee.html은 요청 경로다. 하지만 실제로 이 html 파일이 public이라는 폴더 안에 있다면 실제 경로는 public/bin-lee.html이 된다.
요청 경로와 실제 경로가 다르기 때문에 클라이언트는 실제 경로를 알 수 없게 된다. 때문에 static을 사용하면 보안 면으로 유리한 면이 있다.
요청마다 개인의 저장 공간을 만들어 주는 게 express-session이다.
미들웨어 간에는 순서도 중요한데, 요청 주소에 따라 미들웨어가 어디까지 실행되느냐가 달라진다. 순서 배치에 따라 실행될 필요도 없는 미들웨어가 실행되면서 비효율적으로 동작할 수 있다. 정해진 건 없고 서비스에 따라 조정하면 된다.
내가 찾아본 코드는 morgan
> static
> cookieParser
> session
> express.json
> express.urlencoded
> multer
의 순서로 사용했었다.
res.send
, res.json
을 여러 번 보내면 에러 발생한다. 주의하자.writeHead
와 end
를 사용하지 않는 편이 좋다. express 전용인 send
를 씁시다.res.json
밑에 console을 찍어도 실행된다.