노드

노드 next 활용법

포칼이 2023. 4. 17. 18:22

res.json

http 모듈로 데이터를 json으로 쓰기를 간단히 하면 다음과 같다

res.writeHead(200, { 'Content-Type' : 'application/json' });
res. end(JSON.stringify({ hello: 'me'}));

이 부분이 express에서 굉장히 간단하게 변한다.

res.json({ hello: 'me'});

 

*기본 http의 모듈의 메서드들은 거의 사용하지 않게 된다. 

 

next를 사용해서 에러 처리

의도적으로 throw 를 통해서 에러를 발생시킬 수 있지만 실무에서 에러는 보통 catch 문을 통해 접근한다.

//app.js
const express = require('express');
const path = require('path');

const app = express();
app.set('port', process.env.PORT || 3000);

app.use((req, res, next) => {
  console.log('모든 요청에 실행');
  next();
}, (req, res, next) => {
  try {
    throw new error('에러1111');
  } catch (error) {
    next(error);
  }
})

app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, '/index.html'));
});

app.post('/', (req, res) => {
  res.send('hello express!');
});
 
app.get('/about', (req, res) => {
  res.send('hello express');
});

app.use((err, req, res, next) => {
  console.error(err);
  res.send('에러 발생');
})

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '번 포트에서 대기 중');
});

try catch 블럭에서 에러가 발생했다. 그리고 에러가 발생하면 catch 부분이 실행된다. 

 

그럼 여기서 next는 다음 미들웨어로 넘어가는 것이 아닌가? 라고 생각할 수 있다.

다음 미들웨어로 넘어가는 건 next의 인자가 없을 때이다.

 

next(error) 하면 다음 미들웨어로 넘어가는 것이 아니라 에러처리 미들웨어로 넘어간다.

 

실행하면 다음과 같다

 

*next('route');

해당 라우트의 다음 미들웨어로 넘어가는 것이 아니라 다른 라우터로 넘어간다.

app.get('/', (req, res, next) => {
  res.sendFile(path.join(__dirname, 'index.html'));
  next('route');
}, (req, res) => {
  console.log('실행11');
});

app.get('/', (req, res) => {
  console.log('실행22');
});

이런 코드가 있다고 하면 실행 11이 출력되는 것이 아니라 실행 22가 출력된다.