양재웹
495
2021-08-12 13:06:16
4
224

node.js axios 결과값 return


안녕하세요. 크롤링하고 그에 대한 결과값을 return하는 로직을 짜고있습니다.


async function naver(datas: any): Promise<any> {
  try {
    const result = axios.get(url).then((datas) => {
      const $productInfo = []
      const $ = cheerio.load(datas.data)
      const $body = $(`#content ul li`)
      $body.each((i, item) => {
        $productInfo[i] = {
          name: '',
          pinned: 0,
          likedCount: 0,
          soldOut: '',
          titleImage: '',
          images: '',
          sourceUrl: ``,
          mallId,
          path: ''`,
          categoryId
        }
      })
      let ab
      for (const result of $productInfo) {
        if (result.name !== undefined) {
          //상세페이지 크롤링
          let bb
          // eslint-disable-next-line no-loop-func
          axios.get(result.sourceUrl).then((datas) => {
            const $ = cheerio.load(datas.data)
            const $content = $(`#content`)
            let arr
            $content.each((i, item) => {
              result.originalPrice = ''
              result.price = ''
              result.onSale = 0
              result.discountRate = ''
              result.deliveryFee = 0
              arr = result
            })
            bb = arr
            console.log(bb) //결과값 나옴
          })
        }
      }
    })
    return result // db에 저장하는 함수로 return 오류 발생(undefined)
  } catch (e) {
    throw e
  }
}


이런식으로 진행하고 있는데 bb까지의 결과값은 나오는 상황입니다. 하지만, return result는 undefined가 나옵니다.

상세페이지 크롤링에 있는 for문을 빠져나와야 결과값이 전달될꺼 같은데 return을 써봐도 안돼서 질문드립니다. 해결방법이 있을까요?

0
  • 답변 4

  • 페코옹
    1k
    2021-08-12 13:42:41

    async await 사용법을 익히실 필요가 있을거 같네요.

    then을 사용하는 방식에서 

    const datas = await axios.get(url)

    위와 같은 방식으로 변경해보세요.

  • Dev.kerberos
    944
    2021-08-12 14:18:40

    개인적으로는 axios안에 저렇게 호출하는거 엄청안좋다고봅니다만

    별도로 함수를 따로따로 불러와서 값이 나오도록 해보시는게..

  • 상저씨
    830
    2021-08-12 15:18:06 작성 2021-08-12 15:19:02 수정됨

    비동기 Promise를 호출했으면 then에서 콜백함수로 처리해야합니다.

    axios.get ~~ .then(()=>{})

    then의 콜백함수에서 처리전에 return result 로 가면 undefined가 나오죠


    console.log 로 각 부분 순서를 찍어서 확인해보시면 답이 나오실겁니다


    axios에서 result에 값을 넣는부분에 bb를 출력하고

    return result가 2라고하면

    console에는 2  bb 순서로 나올거구요


    그리고 Promise , async await의 용법도 다시 한번 확인해보세요


  • 양재웹
    495
    2021-08-13 11:00:35

    모두 감사합니다. 해결했습니다.

    페코옹님의 말처럼 then 말고 await로 변경했습니다.

    Promise, async, await의 용법 다시 공부하겠습니다~

  • 로그인을 하시면 답변을 등록할 수 있습니다.