리셋 되지 말자

[express] 미들웨어 만들기 본문

NodeJS/생활코딩

[express] 미들웨어 만들기

kyeongjun-dev 2020. 9. 23. 18:33

미들웨어 만들기

(expressjs.com/en/guide/writing-middleware.html)공식 사이트의 middleware function mylogger 예시를 보면 미들웨어를 만드는 법과 사용법을 간단하게 알 수 있다.

미들웨어 코드

  • code
app.use(function(req, res, next){
    db.query('SELECT * FROM topic', function (error, topics) {
        req.topics = topics;
        next();
    });
    
});

미들웨어는 함수이며, app.use의 인자로 사용할 수 있다. 이때 함수는 request, response, next를 인자로 가지며, next()는 다음 미들웨어를 가르킨다고 이해하면 될것 같다.

  • 실제 적용
//상세 보기 페이지
app.get('/page/:pageId', (req, res) => {
    console.log(req.topics);
    //console.log(req.params.pageId);
    db.query('SELECT * FROM topic', function (error, topics) {
        if (error) throw error;
        db.query('SELECT * FROM topic WHERE topic.id = ?', [req.params.pageId], function (error2, topic) {
            if (error2) throw error2;
            db.query('SELECT * FROM author WHERE id = ?', [topic[0].author_id], function (error3, author) {
                if (error3) throw error3;
                var description = topic[0].description;
                var title = topic[0].title;
                var list = template.list(topics);

                var html = template.html(title, list, `<h2>${title}</h2>${description}<p>by ${author[0].name}</p>`, `<a href="/create">create</a>
                <a href="/update/${topic[0].id}">update</a>
                <form action="/delete_process" method="POST">
                    <input type="hidden" name="id" value="${topic[0].id}">
                    <input type="submit" value="삭제">
                </form>`);
                res.send(html);
            });

        });
    });
});

미들웨어를 등록한 뒤, 상세 페이지를 가게되면 DB의 topic 테이블의 게시글 목록이 출력된다.

 

app.use app.get app.post

app.use는 모든 요청에 대하여 정의하는 미들웨어이다.

  • app.use
app.use(function(req, res, next){
    db.query('SELECT * FROM topic', function (error, topics) {
        req.topics = topics;
        next();
    });
    
});

만약 get 방식으로된 요청에만 미들웨어가 동작하도록 하기 위해서라면 아래와 같이 수정할 수 있다.

  • app.get
app.get('*', function(req, res, next){
    db.query('SELECT * FROM topic', function (error, topics) {
        req.topics = topics;
        next();
    });
    
});

'*'은 get 요청에 한해서 모든 경로에 대하여 미들웨어를 실행한다는 것이다.

어디서 많이 본 방식인데, 지금까지 express로 작성한, 라우팅을 하기 위해 사용한 app.get, app.post 모두 미들웨어이다.

미들웨어를 위에서부터 순차적으로 선언했을 때, 맨 위에부터 미들웨어가 실행이 되고, 해당 경로에 알맞은 미들웨어가 동작하게 된다.

Comments