Dandy Now!
  • [개발자의품격][부트캠프][1기][31차시] Node.js #7 | morgan(로그 관리) | nodemailer(메일 제어)
    2022년 04월 11일 18시 26분 08초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    | morgan

    시스템에서 발생한 로그를 관리한다. 실무에서 운영할 때는 로그를 파일로 관리한다. 다음과 같이 해당 모듈을 설치한다.

     npm install morgan

     

    npm install rotating-file-stream

     

    log폴더를 생성하고 날짜 폴더(예: 202204)를 생성한다. (날짜 폴더가 없을 경우 에러가 발생했다.)

    // 18_morgan.js
    const express = require("express");
    const app = express();
    const fs = require("fs"); // 로그를 파일로 기록하기 위해 필요
    const morgan = require("morgan"); // morgan
    const rfs = require("rotating-file-stream"); // 자동으로 로그 파일을 채번해서 만들어 줌
    const path = require("path");
    
    // 파일명을 만드는 함수
    const generator = (time, index) => {
      if (!time) return "file.log"; // 시간 정보가 없을 때  기본 파일명
    
      const yearmonth =
        time.getFullYear() + (time.getMonth() + 1).toString().padStart(2, "0");
      const day = time.getDate().toString().padStart(2, "0");
      const hour = time.getHours().toString().padStart(2, "0");
      const minute = time.getMinutes().toString().padStart(2, "0");
    
      return `${yearmonth}/${yearmonth}${day}-${hour}${minute}-${index}-file.log`;
    };
    
    const accessLogStream = rfs.createStream(generator, {
      interval: "1m", // 1m은 1분 간격, 실무에서는 1d 하루 단위를 주로 사용
      size: "10M", // 파일의 최대 사이즈
      path: path.join(__dirname, "log"), // 현재 디렉토리(__dirname)의 log 폴더에 로그 파일 생성
    });
    
    app.use(morgan("combined", { stream: accessLogStream })); // combined는 로그를 남기는 기본 포맷 중 하나
    
    // 400번 이상의 에러가 발생했을 때 로그 기록함
    // app.use(
    //   morgan("combined", {
    //     stream: accessLogStream,
    //     skip: function (req, res) {
    //       return res.statusCode < 400;
    //     },
    //   })
    // );
    
    app.get("/", (req, res) => {
      res.send("Hello World");
    });
    
    app.listen(3000, () => {
      console.log("서버가 포트 3000번으로 시작되었습니다.");
    });

     


     

    | nodemailer

    메일을 제어하는 모듈이다. 다음과 같이 모듈을 설치한다.

    npm install nodemailer

     

    실습을 위해서 구글 메일에서 앱키를 받아야 한다.

    // nodemailer/index.js
    const nodemailer = require("nodemailer");
    
    // 교재 261
    const config = {
      service: "gmail",
      host: "smtp.gmail.com",
      port: 587,
      secure: false,
      auth: {
        user: process.env.GOOGLE_MAIL,
        pass: process.env.GOOGLE_PASSWORD,
      },
    };
    
    const send = async (data) => {
      const transporter = nodemailer.createTransport(config);
      transporter.sendMail(data, (err, info) => {
        if (err) {
          console.log(err);
        } else {
          return info.response;
        }
      });
    };
    
    module.exports = {
      send,
    };

     

    // 19_nodemailer.js
    const express = require("express");
    const app = express();
    // console.log(app.get("env"));
    
    require("dotenv").config({ path: `nodemailer/.env` });
    const nodemailer = require("./nodemailer");
    
    // console.log(process.env);
    
    app.use(
      express.json({
        limit: "50mb", // 최대 50메가
      })
    ); // 클라이언트 요청 body를 json으로 파싱 처리
    
    app.listen(3000, () => {
      console.log("서버가 포트 3000번으로 시작되었습니다.");
    });
    
    app.post("/api/email", async (req, res) => {
      console.log(req.body.param);
      const r = await nodemailer.send(req.body.param);
      res.send(r);
    });

     

    728x90
    반응형
    댓글