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);
});