인프런 커뮤니티 질문&답변

이승훈님의 프로필 이미지

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

app.use()와 프로미스 인스턴스의 우선순위

해결된 질문

22.01.08 20:21 작성

·

104

0

 안녕하세요 조현영님 오랜만에 질문올립니다.

제가 모종의 이유로 인해 app.use()를 프로미스 객체를 반환하는 함수랑 같이 쓰기 위해서 다음과 같은 코드를 만들었습니다.


(async () => {
    try {
        const result = await getNum();

        process.nextTick(() => {
            app.use("/product/product1", product1Router);
            app.use("/product/product2", product2Router);
            app.use("/product/product3", product3Router);
        });
    } catch (err) {
        console.error(err.message);
    }
})();

 일단 app.use("/product/...")를 async/await 구문안에 넣지 않거나 const result = await getNum() 위에 선언하여 사용하면 해당 경로에 get요청을 보낼시 페이지가 잘 나오게 됩니다. 허나  const result = await getNum() 밑에 선언하게 되면 페이지와 콘솔에 제가 만들어 놓았던 404 처리 미들웨어가 실행되며 에러를 뿜습니다 (경로가 인식이 안되는 거 같습니다).

 await getNum()의 처리가 늦어져서 밑에 있던 app.use()가 실행이 안되는게 아닐까 생각하며 조현영님께서 process.nextTick()을 사용하면 프로미스 객체보다 실행 우선순위를 빠르게 점유 할수 있다는 말씀을 듣고 app.use()를 process.nextTick()으로 감싸버렸습니다. 그런데 프로미스는 비동기 처리이니까 getNum()의 처리가 아무리 늦어져도 밑에 있는 app.use()가 실행이 되어야하는거 아닐까요? 만약에 product1Router역시 async/await으로 감싸져 있다면 문제가 될까요? 혹시 모르니 product1Router 코드도 보여드리겠습니다. (product2Router, product3Router역시 형태는 product1Router와 같습니다.)

const express = require("express");
const axios = require("axios");
const router = express.Router();
const showPage = require("../modules/showPage");

router.route("/").get(async (req, res) => {
    try {
        const result = await axios.get("http://127.0.0.1:3257");
        const productID = String(result.data[0].id);

        showPage(productID, res);
        console.log("Request Type:", req.method);
    } catch (err) {
        console.error(err);
    }
});

module.exports = router;

product1Router역시 async/await으로 감싸져서 process.nextTick()의 효과를 못 받는건가요? 그게 아니라면 어떤 문제가 있을까요? 굳이 process.nextTick()을 이용해서 코드를 짤 필요는 없으니 어떤 이유 때문에 const result = await getNum() 아래에 app.use()를 사용하면 실행이 안되는지 궁금합니다.

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2022. 01. 09. 11:28

app.use는 비동기적으로 호출할 수 없습니다. process.nextTick이나 await 모두 비동기라서 안 됩니다.