티스토리 뷰

728x90
SMALL

callback 지옥이란 callback함수의 중첩 때문에 코드가 너무 복잡해지는 것을 말합니다.

아마 자바스크립트를 사용하시는 분들은 한번 쯤 겪었을 문제입니다.

오늘은 express mysql에서 콜백지옥을 탈출하는 법을 쓸려고 합니다.

 

저번 글에서 promise와 async await를 다루었습니다.

오늘은 조금 더 응용해서 nodejs express mysql에서 promise, asyn await를 사용하는 방법을 알아보겠습니다.

(nodejs express, mysql, promise, asyn await 중 하나라도 모르시는 것이 있으면 코드를 이해하기 힘들 수 있습니다.)

일단 mysql이외의 특별한 모듈은 사용하지 않겠습니다. (이 글은 promise, async await 입문자들을 위한 글입니다.)

 

예제는 회원가입을 할 때 아이디 중복확인과 닉네임 중복확인을 예로 들겠습니다.

실제로는 프론트에서 서버로 데이터를 넘겨주지만 그 부분은 생략했고

뒤에 코드도 있지만 생략하고 이 두가지만 가지고 하겠습니다.

0. callback hell

router.get("/ex", function (req, res) {

    var email = "123";

    var displayName = "123";

    db.query("SELECT id FROM users WHERE email=?", [email], function (err, overlap) {

      if (err) {

        throw err;

      }

      if (!ftn.isEmpty(overlap)) { //isEmpty 함수는 내용이 비어있나 확인하는 함수입니다.

        res.json("이메일이 존재합니다");

        return false;

      }

      db.query("SELECT id FROM users WHERE displayName=?", [displayName], function (

        err2,

        overlap2

      ) {

        if (err2) {

          throw err2;

        }

        if (!ftn.isEmpty(overlap2)) {

          res.json("닉네임이 존재합니다");

          return false;

        }

    });

  });

});

 

1. promise

router.get("/ex", function (req, res) {

    var email = "123";

    var displayName = "123";

 

    var overlap = new Promise((resolve, reject) => {

      db.query("SELECT id FROM users WHERE email=?", [email], function (err, overlap) {

        if (err) {

          reject(Error("error"));

        } else {

          resolve(overlap);

        }

      });

    });

    overlap.then(

      function (success) {

        if (!ftn.isEmpty(success)) {

          res.json("이메일이 존재합니다");

          return false;

        }

      },

      function (err) {

        console.error(err);

      }

    );

 

    var overlap2 = new Promise((resolve, reject) => {

      db.query("SELECT id FROM users WHERE displayName=?", [displayName], function (

        err,

        overlap2

      ) {

        if (err) {

          reject(Error("error"));

        } else {

          resolve(overlap2);

        }

      });

    });

    overlap2.then(

      function (success) {

        if (!ftn.isEmpty(success)) {

          res.json("닉네임이 존재합니다");

          return false;

        }

      },

      function (err) {

        console.error(err);

      }

    );

  });

 

 

2. async await

router.get("/ex2", function (req, res) {

    var email = "12345";

    var displayName = "123";

    var overlap = function () {

      return new Promise((resolve, reject) => {

        db.query("SELECT id FROM users WHERE email=?", [email], function (err, overlap) {

          if (err) {

            reject(Error("error"));

          } else {

            resolve(overlap);

          }

        });

      });

    };

 

    var overlap2 = function () {

      return new Promise((resolve, reject) => {

        db.query("SELECT id FROM users WHERE displayName=?", [displayName], function (

          err,

          overlap2

        ) {

          if (err) {

            reject(Error("error"));

          } else {

            resolve(overlap2);

          }

        });

      });

    };

 

    (async function () {

      const slow = await overlap();

      if (!ftn.isEmpty(slow)) {

        res.json("이메일이 존재합니다");

        return false;

      }

      const fast = await overlap2();

      if (!ftn.isEmpty(fast)) {

        res.json("닉네임이 존재합니다");

        return false;

      }

    })(); //즉시 실행함수를 모른다면 함수명을 입력하고 함수명() 으로 실행하시면 됩니다.

  });

 

 

728x90
LIST
댓글
공지사항