작지만 꾸준한 반복

[Javascript] forEach는 async를 안기다려준다 본문

트러블슈팅

[Javascript] forEach는 async를 안기다려준다

iamjooon2 2022. 9. 7. 00:52

요즘은 로컬에 데이터베이스를 설치하지 않고 도커로 DB를 띄워서 사용하고 있다

 

aquerytool이나 quickDBD 같은 온라인 사이트를 이용하여 DB를 설계한 후 추출한 DB 생성 쿼리를 저장해두고

javascript에서 해당 생성쿼리가 있는 파일을 읽어와서 실행시키는 방식으로 사용하고있다

가뜩이나 AWS 프리티어 요금도 끝나서 막막했는데 아주 쏠쏠하다

 

문제 코드는 다음과 같다

const fs = require('fs')
const serviceDB = require('adapters/servicedb')

const init = async () => {
  try {
    const fileSQL = await fs.readFileSync('src/adapters/servicedb/init.sql', { encoding: 'utf8' })

    fileSQL.split(';').forEach((sql) => {
      if (sql.indexOf('CREATE') !== -1) {
        serviceDB.connection.execute(sql, (err) => {
          if(err) {
            throw err
          }
        })
      }
    })
  } catch(e) {
    console.error(e)
  }
}

init()

 

DB 생성 쿼리가 먹다가 멈추는 현상이 자꾸 일어났다..

 

해결하려고 이것저것 찾다가 전통적인 for문을 사용해보니 문제가 해결됐고,

내린 결론은 forEach로 비동기 함수를 돌린 것이 화근이었다.

 

그리고 forEach 함수는 async를 기다려주지 않는다는 사실을 알게 되었다

 

먼저 저 상황은 다음과 같이 변경하여 해결하였다

const fs = require('fs')
const serviceDB = require('adapters/servicedb')

const init = async () => {
  try {
    const fileSQL = await fs.readFileSync('src/adapters/servicedb/init.sql', { encoding: 'utf8' })

    const splits = fileSQL.split(';')
    for (let i = 0; i < splits.length; i += 1) {
      const sql = splits[i]
      if (sql.indexOf('CREATE') !== -1) {
        await serviceDB.connection.promise().execute(sql)
      }
    }
  } catch(e) {
    console.error(e)
  }
}

init()

 

앞으로 또 마주할지 모르는 나를 위해 정리해둔다

 

한줄 요약

javascript forEach는 비동기함수 안기다려줌

 

두줄 요약

javascript forEach는 비동기함수 안기다려줌

for나 for.. of 를 사용하여 해결할 수 있다

 

 

레퍼런스

https://velog.io/@hanameee/%EB%B0%B0%EC%97%B4%EC%97%90-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9E%91%EC%97%85%EC%9D%84-%EC%8B%A4%EC%8B%9C%ED%95%A0-%EB%95%8C-%EC%95%8C%EC%95%84%EB%91%90%EB%A9%B4-%EC%A2%8B%EC%9D%84%EB%B2%95%ED%95%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0%EB%93%A4#for-%EB%AC%B8%EC%9C%BC%EB%A1%9C-%EB%B3%80%EA%B2%BD%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

배열에 비동기 작업을 실시할 때 알아두면 좋은 이야기들

프론트엔드 인턴 면접에서 비동기 작업 관련 질문 대답 못한 뒤 외양간 뚝딱뚝딱 고치는 이야기.

velog.io

https://constructionsite.tistory.com/43

 

[JS] forEach 함수는 async 함수를 기다려주지 않는다

최근 Mongoose를 사용하는 프로젝트를 진행하면서 forEach 함수는 비동기(async) 함수를 기다려주지 않는다는 걸 알게 되었다. forEach 함수의 콜백이 비동기 함수일 때 경험한 문제 문제가 생긴 코드는

constructionsite.tistory.com