익스프레스 미들웨어 사용

https://www.amazon.com/John-Au-Yeung/e/B08FT5NT62에서 Amazon에서 내 책을 확인하십시오.

지금 http://jauyeung.net/subscribe/에서 내 이메일 목록을 구독하십시오.

미들웨어 함수는 요청 및 응답 객체에 접근할 수 있는 함수이며, 다음 미들웨어를 호출하기 위한 next 함수입니다.

이 기사에서는 Express 미들웨어의 기능과 사용 방법을 살펴보겠습니다.

미들웨어의 특징



미들웨어 함수는 모든 코드를 실행하고, 요청 및 응답 객체를 변경하고, 요청-응답 주기를 종료하고, 스택의 다음 미들웨어를 호출할 수 있습니다.

애플리케이션 수준 미들웨어



모든 경로가 호출될 때 사용되는 미들웨어를 app.use 메서드에 콜백으로 전달하여 실행할 수 있습니다.

하나의 요청 메서드의 요청이 호출될 때만 미들웨어 함수가 호출되도록 하려면 이를 app.METHOD 메서드에 콜백으로 전달할 수 있습니다. 여기서 METHODget , post , put , delete 등입니다.

예를 들어 미들웨어 함수를 작성하고 app.use에 전달하여 다음과 같이 요청의 요청 방법을 기록할 수 있습니다.

const express = require('express')  
const app = express()  
app.use(express.json())  
app.use(express.urlencoded({ extended: true }))
app.use((req, res, next) => {  
  console.log(req.method);  
  next();  
});

app.get('/', (req, res) => {  
  res.json();  
})

app.listen(3000, () => console.log('server started'));


그런 다음 GET 에 GET 요청을 할 때 / 기록되어야 합니다.

다음과 같이 작성하여 미들웨어 기능이 GET 요청 및 경로/에서만 실행되도록 제한할 수 있습니다.

const express = require('express')  
const app = express()  
app.use(express.json())  
app.use(express.urlencoded({ extended: true }))
app.get('/', (req, res, next) => {  
  console.log(req.method);  
  next();  
});

app.get('/', (req, res) => {  
  res.json();  
})

app.post('/', (req, res) => {  
  res.json();  
})

app.listen(3000, () => console.log('server started'));


그러면 GET 경로에 GET 요청을 할 때 기록되는 /만 볼 수 있습니다.

일련의 미들웨어 기능 실행


next 메서드를 사용하여 시리즈의 다음 미들웨어 함수를 호출할 수 있으므로 미들웨어 함수 호출을 함께 연결할 수 있습니다.

예를 들어 다음이 있는 경우:

const express = require('express')  
const app = express()  
app.use(express.json())  
app.use(express.urlencoded({ extended: true }))
app.use(  
  (req, res, next) => {  
    console.log('middleware 1 called');  
    next();  
  },  
  (req, res, next) => {  
    console.log('middleware 2 called');  
    next();  
  }  
);

app.get('/', (req, res) => {  
  res.json();  
})

app.listen(3000, () => console.log('server started'));


그런 다음 우리는 다음을 봅니다.

middleware 1 called  
middleware 2 called


각 미들웨어의 console.log 출력에서.

미들웨어에서 응답을 보내면 다음 미들웨어가 호출되지 않습니다. 예를 들어 다음이 있는 경우:

const express = require('express')  
const app = express()  
app.use(express.json())  
app.use(express.urlencoded({ extended: true }))  
app.get('/',  
  (req, res, next) => {  
    next()  
  },  
  (req, res, next) => {  
    res.send('Second middleware');  
  }  
)

app.get('/',  (req, res, next) => {  
  res.end();  
})

app.listen(3000, () => console.log('server started'));


그런 다음 / 에 요청할 때 'Second middleware' 출력을 얻습니다.

우리의 라우트 핸들러:

app.get('/', function (req, res, next) {  
  res.end();  
})


호출되지 않았습니다.

다음과 같이 next에 전화할 수 있습니다.

next('route');


다른 미들웨어 기능을 무시하고 경로 처리기로 바로 이동합니다.

예를 들어 다음이 있는 경우:

const express = require('express')  
const app = express()  
app.use(express.json())  
app.use(express.urlencoded({ extended: true }))  
app.get('/:id',  
  (req, res, next) => {  
    if (req.params.id === '0') {  
      next('route');  
      return;  
    }  
    next();  
  },  
  (req, res, next) => {  
    res.send('Second middleware');  
  }  
)

app.get('/:id', (req, res, next) => {  
  res.end(req.params.id);  
})

app.listen(3000, () => console.log('server started'));


그런 다음 /0 에 요청하면 0 를 얻습니다. 그렇지 않으면 'Second Middleware'가 출력됩니다.

라우터 수준 미들웨어



라우터 수준 미들웨어는 앱 수준 미들웨어와 같은 방식으로 작동하지만 express.Router() 인스턴스 대신 express 인스턴스에 바인딩됩니다.

예를 들어 다음과 같이 사용할 수 있습니다.

const express = require('express')  
const app = express()  
const router = express.Router();
app.use(express.json())  
app.use(express.urlencoded({ extended: true }))

router.use((req, res, next) => {  
  req.requestTime = new Date();  
  next();  
})

router.get('/', (req, res, next) => {  
  res.json(req.requestTime);  
})

app.use('/', router);

app.listen(3000, () => console.log('server started'));


그런 다음 / 경로를 요청할 때 타임스탬프를 출력으로 반환합니다.

미들웨어 연결 및 경로 건너뛰기는 앱 수준 미들웨어와 동일한 방식으로 작동합니다. 예를 들어 다음과 같이 미들웨어를 연결하기 위해 다음을 작성할 수 있습니다.

const express = require('express')  
const app = express()  
const router = express.Router();

app.use(express.json())  
app.use(express.urlencoded({ extended: true }))

router.use(  
  (req, res, next) => {  
    console.log('middleware 1 called');  
    next();  
  },  
  (req, res, next) => {  
    console.log('middleware 2 called');  
    next();  
  }  
)

router.get('/', (req, res, next) => {  
  res.json();  
})

app.use('/', router);

app.listen(3000, () => console.log('server started'));


그런 다음 우리는 다음을 봅니다.

middleware 1 called  
middleware 2 called


각 경로 미들웨어의 console.log 출력에서.
next('route')를 사용하여 다음과 같이 경로로 건너뛸 수 있습니다.

const express = require('express')  
const app = express()  
const router = express.Router();
app.use(express.json())  
app.use(express.urlencoded({ extended: true }))

router.get('/:id',  
  (req, res, next) => {  
    if (req.params.id === '0') {  
      next('route');  
      return;  
    }  
    next();  
  },  
  (req, res, next) => {  
    res.send('Second middleware');  
  }  
)

router.get('/:id', (req, res, next) => {  
  res.end(req.params.id);  
})

app.use('/', router);
app.listen(3000, () => console.log('server started'));


그런 다음 /0 에 요청하면 0 를 얻습니다. 그렇지 않으면 'Second Middleware'가 출력됩니다.

결론



Express 미들웨어를 사용하는 것은 간단합니다. app.use 미들웨어가 모든 요청 메서드에 대해 실행되도록 하거나 app.METHOD 지정된 메서드에 대해 실행되도록 전달할 수 있습니다.
next를 호출하여 다음 미들웨어를 호출하고 next('route')를 호출하여 미들웨어에서 직접 경로 핸들러를 호출할 수 있습니다.

각각 express.Router()express()에 바인딩한다는 점을 제외하고는 모든 것이 경로 및 앱 수준 미들웨어에 모두 적용됩니다.

좋은 웹페이지 즐겨찾기