티스토리 뷰
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;
}
})(); //즉시 실행함수를 모른다면 함수명을 입력하고 함수명() 으로 실행하시면 됩니다.
});
'자바스크립트' 카테고리의 다른 글
자바스크립트 var, let, const (0) | 2020.06.25 |
---|---|
자바스크립트(javascript) Date 함수 사용법 (0) | 2020.06.24 |
nodejs express mysql 콜백지옥 탈출하기2(mysql2 async await) (6) | 2020.05.27 |
async await 사용법 (0) | 2020.05.27 |
promise 사용법 (0) | 2020.05.17 |