나만의 Express 미들웨어 만들기

Express는 사용자에게 정적 경로를 표시하는 일반적인 방법입니다. Node.JS용 API를 만드는 데 훨씬 더 일반적으로 사용됩니다. Express에서는 URL과 해당 URL에서 발생하는 작업을 쉽게 정의할 수 있습니다. 최종 요청이 반환되기 전에 실행되는 미들웨어를 정의할 수도 있습니다. 이렇게 하면 요청을 변경할 수 있고 많은 경로에서 표준 방식으로 수행할 수 있습니다.

Express를 사용했다면 bodyParser 또는 jsonParser 와 같은 미리 빌드된 미들웨어를 이미 사용했을 수 있습니다. 이 가이드에서는 사용자 지정 미들웨어를 만드는 방법을 살펴보겠습니다.

Express에서 미들웨어 생성



미들웨어는 단순히 데이터가 실제 최종 위치로 가는 도중에 통과하는 것입니다. 다음과 같은 경로가 있다고 가정합니다.

import express from 'express';
const app = express()

app.get('/home/', (req, res, next) => {
    if(req.getRoute == true) {
        res.status(200).send("Hello world!")
    }
    else {
        res.status(200).send("Goodbye world!")
    }
})


이 예에서 요청 또는 req의 속성getRoute이 true로 설정된 경우 다른 텍스트 집합을 표시합니다. 기본적으로 HTTP 요청에는 getRoute 라는 속성이 없습니다. 물론 /home/ 자체 내에서 설정하는 것은 쉽지만 이 하나의 getRoute 속성에 따라 여러 요청이 있다고 상상해 보십시오.

import express from 'express';
const app = express()

app.get('/home/', (req, res, next) => {
    if(req.getRoute == true) {
        res.status(200).send("Hello world!")
    }
    else {
        res.status(200).send("Goodbye world!")
    }
})

app.get('/home/article', (req, res, next) => {
    if(req.getRoute == false) {
        res.status(200).send("This is my article");
    }
    else {
        res.status(400).send("ERROR OCCURRED");
    }
})


이제 미들웨어가 의미가 있는 상황이 되었습니다. use() 를 사용하거나 함수를 통해 미들웨어를 정의하는 두 가지 방법이 있습니다. 먼저 use()를 살펴보겠습니다.

미들웨어로 use()



이전 예제를 고려하면 use()를 사용하여 모든 경로에서 실행되는 함수를 작성할 수 있습니다. 따라서 이것은 사용자가 서버의 유효한 경로로 이동할 때마다 실행되는 일반 미들웨어입니다. 다음은 getRoute 미들웨어 내에서 use()를 정의하는 예입니다.

app.use((req, res, next) => {
    // Add getRoute to our request object
    req.getRoute = true;
    // Next tells express to now go to the next valid function.
    next();
});

app.get('/home/', (req, res, next) => {
    if(req.getRoute == true) {
        res.status(200).send("Hello world!")
    }
    else {
        res.status(200).send("Goodbye world!")
    }
})

app.get('/home/article', (req, res, next) => {
    if(req.getRoute == false) {
        res.status(200).send("This is my article");
    }
    else {
        res.status(400).send("ERROR OCCURRED");
    }
})


이 미들웨어를 사용하여 요청에 getRoute를 추가할 수 있으며 이제 /home//home/article에서 사용할 수 있습니다. 서버의 다른 경로에서도 사용할 수 있습니다. next() 를 호출하면 Express에 다음 유효한 경로로 이동하도록 지시합니다. 예를 들어 사용자가 /home/ 로 이동하면 먼저 미들웨어가 호출되고 그 안에서 next() 를 호출했기 때문에 Express는 정의한 대로 /home/ 경로로 이동합니다.

사용 사례: API 확인



일반화된 미들웨어에 자주 사용하는 트릭은 특정 HTTP 메서드에 적용되는 기능을 분할하는 것입니다. 예를 들어 API 확인 기능을 모든POST 요청에 적용하려는 경우 전체 앱에서 사용하는 표준 미들웨어에서 쉽게 수행할 수 있습니다.

import { apiVerification } from './util.js'
app.use(async (req, res, next) => {
    // Here, apiVerification is a function that returns true if the right request is sent.
    // We only want to apply it to POST methods, though, so lets add that to our middleware.
    if(req.method == "POST") {
        let verifyCredentials = await apiVerification(req);
        if(verifyCredentials) {
            next();
        }
        else {
            res.status(400).send("ERROR OCCURRED");
        }
    }
    else {
        // For everything else, like "GET", go to next valid route.
        next();
    }
});


이는 매번 POST를 재정의하고 호출할 필요 없이 모든 apiVerification 경로에 표준 확인 방법을 추가하는 완벽한 방법입니다. apiVerification가 실패하면 대신 사용자에게 오류 메시지가 표시됩니다. GET 와 같은 다른 방법의 경우 이 apiVerification 단계를 건너뜁니다.

특정 미들웨어



때로는 미들웨어가 일반적으로 모든 것이 아니라 특정 경로에만 적용되기를 원할 수 있습니다. 이를 위해서는 함수에서 정의해야 합니다. 이전 예제를 사용하여 req.getRoute 에 대한 함수를 만들고 원하는 경로에만 적용할 수 있습니다.

let setGetRoute = (req, res, next) => {
    req.getRoute = true;
}

app.get('/home/', setGetRoute, (req, res, next) => {
    if(req.getRoute == true) {
        res.status(200).send("Hello world!")
    }
    else {
        res.status(200).send("Goodbye world!")
    }
})

app.get('/home/article', (req, res, next) => {
    if(req.getRoute == undefined) {
        res.status(200).send("This is my article");
    }
    else {
        res.status(400).send("ERROR OCCURRED");
    }
})


이제 req.getRouteapp.get('/home/'.. 에만 사용할 수 있습니다. 해당 기능을 해당 경로( app.get('/home/', setGetRoute... )에만 추가했기 때문입니다. /home/article의 경우 req.getRoute를 사용할 수 없습니다.

이는 특정 상황에서만 특정 기능을 제공하려는 경우 매우 유용합니다.

결론



미들웨어는 Express의 강력한 부분이며 요청을 다르게 처리하거나 모든 요청에 ​​특정 기능을 적용할 수 있습니다. 이 기사를 즐겼기를 바랍니다. learn more about Javascript, click here에게 .

좋은 웹페이지 즐겨찾기