ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js] 모듈 시스템 사용하기
    Node.js 2023. 12. 4. 15:04

    다른 파일에서 사용할 수 있는 모듈을 직접 만들어 노드에 등록할 수 있다.

     

    먼저 서버를 구동하는 파일을 깔끔하게 만들어보자.

    //app.js
    const http = require("http");
    
    const server = http.createServer((req,res) => {});
    
    server.listen(3000);

     

    이제 이 파일은 서버를 시동하기만 하고 아무 기능이 없다.

     

    화살표 함수 내에 기존에 있던 내용들은

    url 확인 등 라우팅 로직을 포함하는

    routes.js 파일로 만들어보자.

     

    //routes.js
    const fs = require("fs");
    
    const requestHandler = (req, res) => {
      const url = req.url;
      const method = req.method;
    
      if (url === "/") {
        res.write("<html>");
        res.write("<head><title>Enter Message</title></head>");
        res.write(
          '<body><form action="/message" method="POST"><input type="text" name="message"><button type-"submit">Send</button></form></body>'
        );
        res.write("</html>");
    
        return res.end();
      }
    
      if (url === "/message" && method === "POST") {
        const body = [];
        req.on("data", (chunk) => {
          console.log(chunk);
          body.push(chunk);
        });
        return req.on("end", () => {
          const parsedBody = Buffer.concat(body).toString();
          const message = parsedBody.split("=")[1];
          //fs.writeFileSync("message.txt", message);
          //writeFileSync는 파일 작성이 완료될 때까지 코드실행을 막는다. 즉, 다음 행을 읽을 수 없다.
          fs.writeFile("message.txt", message, (err) => {
            res.statusCode = 302;
            res.setHeader("Location", "/");
            return res.end();
          });
        });
      }
    
      res.setHeader("Content-type", "text/html");
      res.write("<html>");
      res.write("<head><title>My First Page</title></head>");
      res.write("<body><h1>Hello from my Node.js Server!</h1></body>");
      res.write("</html>");
    
      res.end();
    };
    
    module.exports = requestHandler;

     

    이 코드의 상단부를 자세히 보자.

    const fs = require("fs");
    
    const requestHandler = (req, res) => {
      const url = req.url;
      const method = req.method;

     

    파일 시스템을 활용하기 위해 fs 모듈을 가져왔고

    requestHandler라는 상수에 기존 서버의 요청과 응답을 관리하는 화살표 함수를 만들었다.

     

    하단부를 보면

    module.exports = requestHandler;

     

    module.exports를 통해 무엇을 노드 모듈로 등록할지를 정한다.

    여기서는 앞에서 만든 requestHandler 함수를 저장했다.

     

    다시 app.js로 돌아와서

    const http = require("http");
    
    const routes = require('./routes')
    
    const server = http.createServer(routes);
    
    server.listen(3000);

     

    http 모듈을 불러올 때와 마찬가지로

    require를 써서 app.js와 같은 폴더에 있는 routes.js를 불러온다.('.js'는 생략 가능)

    server의 매개변수로 routes를 입력해주면 서버의 요청과 입력이 자동으로 routes로 전달된다.

     


     

    module.exports는 다음과 같이 쓸 수도 있다.

     

    //객체를 저장할 수도 있다. 이 때 app.js에서 routes.handler로 requestHandler함수에 접근한다
    module.exports = {
      handler: requestHandler,
      someText: "Some hard coded text",
    };
    
    //위 객체를 분해해서 다음과 같이 쓸 수도 있다.
    module.exports.handler = requestHandler;
    module.exports.someText = "Some hard coded text2";
    
    //이 때 module.은 생략 가능하다.
    exports.handler = requestHandler;
    exports.someText = "Some hard coded text2";

     

Designed by Tistory.