본문 바로가기
카테고리 없음

[async, promise] db쿼리와 처리 순서

by hbIncoding 2023. 7. 23.

0. 문제 코드

Mutation: {
        add: async (_, args) => {

            let name = args.device_name
            let address = args.device_address
            let pile_max = args.pile_max
            
            const sqlQuery = "INSERT INTO DEVICES (DEVICE_NAME, DEVICE_ADDRESS, PILE_MAX) VALUES (?,?,?)";
            
            let recall_id;
            await db.query(sqlQuery, [name,address,pile_max], (err, result) => {
                if (err) {
                    console.log(err);
                }else{
                    recall_id = result.insertId;
                    console.log("Inrecall_id : "+ recall_id)
                }
            });

            console.log("recall_id : "+ recall_id)

            const [rows] = await db.query("SELECT * FROM DEVICES WHERE device_id = ?", [recall_id]);

            const device = rows.map(row => ({
                device_id: row.DEVICE_ID,
                device_name: row.DEVICE_NAME,
                device_address: row.DEVICE_ADDRESS,
                pile_max: row.PILE_MAX
            }));

            return device;
        }
    }

 

1. console.log 호출 순서

recall_id : undefined
Inrecall_id : 30
  • 비동기 처리로 인하여 db.query가 수행 완료 되기 전에 다음 코드가 진행되는 것 같다.
  • add 함수 내부에 있는 await는 현재 없는 것과 마찬가지로 기능을 수행하지 못하고 있다.
  • 이를 위해서는 함수 내부에 또 함수를 만들어 리턴하는 콜백 지옥을 해야하거나 프로미스를 이용하여 해결해야한다.

2. 해결 코드

add: async (_, args) => {

            const name = args.device_name
            const address = args.device_address
            const pile_max = args.pile_max
            const sqlQuery = "INSERT INTO DEVICES (DEVICE_NAME, DEVICE_ADDRESS, PILE_MAX) VALUES (?,?,?)";

            const recallId = await new Promise(function (resolve, reject) {
                db.query(sqlQuery, [name, address, pile_max], (err, result) => {
                    if (err) {
                        throw err;
                    } else {
                        resolve(result.insertId);
                    }
                });
            });

            const rows = await new Promise((resolve, reject) => {
                db.query("SELECT * FROM DEVICES WHERE DEVICE_ID = "+recallId, (err, result) => {
                    if (err) {
                        reject(err);
                    }else{
                        resolve(result)
                    }
                });
            });

            devices = rows.map(row => ({
                device_id: row.DEVICE_ID,
                device_name : row.DEVICE_NAME,
                device_address : row.DEVICE_ADDRESS,
                pile_max : row.PILE_MAX
            }));

            return devices[0];

        },
  • Promis함수를 이용해서 해당 함수가 끝날때 까지 기다리도록 코드를 작성한다.
  • resolve()는 성공시 , reject()는 실패시 값을 리턴한다.

3. Promise 사용 기본 틀

const myPromise = new Promise((resolve, reject) => {
	resolve();
});

myPromise
	.then(data => {
    console.log(data);
    })
    .catch(err => {
    console.error(err);
    });