다이나모에 쿼리를 보내고 그 값을 클라이언트에 전달하는 상황이었다.
AWS 독스에 있는 코드를 참고해서
docClient.query(params, function(err, data) {
if (err) {
console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
} else {
console.log("Query succeeded.");
data.Items.forEach(function(item) {
console.log(" -", item.year + ": " + item.title);
});
}
});
의 형식을 이용해, 쿼리의 값을 바로 함수로 넘기고, 그 값을 가공해 클라이언트로 넘기려고 하였다.
export default async ({ //파라미터 }: IParams) => {
//생략
let result;
try {
await docClient
.query(params, async function (err, data) {
if (err) {
console.error('Unable to read item. Error JSON:', JSON.stringify(err, null, 2));
} else {
data.Items.forEach(function(item) {
//item을 가공해 result라는 변수에 저장함
//여기도 await 처리를 했습니다
});
}
})
return result;
};
위 같은 방식으로 진행하였는데, 익명 함수를 기다리지 않고 값을 반환하는 문제가 생겼다.
구체적으로 말하자면, 익명함수를 처리하기도 전에 프로그램이 종료하여서 결국 result 변수에 아무 값도 없는 채로 return을 하게 되는 것이었다.
어떻게 구글링을 해야 할지도 몰라 삽질만 몇 시간 했다.
그래서 찾은 게 비동기 처리할 때, promise를 반환해줘야 한다는 것이었다. (사실 맞는지 모르겠음) 단순하게 쿼리 뒤에 .promise()를 붙여주면 된다.
await docClient.query(params).promise();
다 된 줄 알았는데, 역시 똑같은 문제가 생겼다. 콘솔에 로그는 잘 찍히지만, return은 그 전에 해버리는 것이었다. Promise.all(), await 남발,동기식 처리 등 별 짓을 다 해봤지만 그저 삽질이었다.
결국 .then() 함수를 쓰고서야 뭐가 문제인지 알았다.
query 함수 자체는 쿼리가 끝나고 바로 promise를 반환하여, return까지 진행되는 것이었다. 그래서 익명함수에서 가공하기도 전에 promise를 잘 반환했다고 봐져서 그냥 프로그램이 끝나는 것이었다.
그래서 promise를 반환한 후에, 그 데이터를 가지고 쿼리 밖에서 작업을 해야 했다.
query값을 변수에 저장하여 for문을 돌리고 싶었지만, 여기서 이 변수를 어떻게 다뤄야 할지 모르겠어서
'.then(result)'를 사용해 바로 then으로 데이터를 넘겨서 그 값을 사용했다.
export default async ({ //파라미터 }: IParams) => {
let result;
//생략
await docClient
.query(params, async function (err, data) {//})
.promise()
.then(async function (data) {
//이 data변수를 가지고 result 변수에 저장
});
return result;
};
이렇게 하면 된다.
나는 비동기처리에 익숙하지 않아 그냥 await만 쓰면 되는 줄 알았다... 역시 사람은 기본기가 탄탄해야 뭐라도 하는듯...
'DB' 카테고리의 다른 글
[MySQL] ERROR: Another process with pid ~ is using unix socket file. (0) | 2024.09.30 |
---|---|
[MySQL] Rollback Pointer 기반의 MVCC 이해하기 - 코드 중심으로 (1) | 2024.02.06 |
[MySQL] 전문검색 FullText Search 기능 이용해 검색 구현하기 - AWS RDS innoDB 8.0.28 (0) | 2022.09.14 |
[DynamoDB] DynamoDB의 구성 요소들(key, index) (0) | 2022.01.14 |
[DB] NoSql의 종류 및 차이 (0) | 2021.12.22 |