Javascript: 소켓통신 서버에서 클라이언트로 데이터 전달할 때

조회수 1170회

안녕하세요.

아직도 크롤러를 만들고 있습니다. s3 업로드 부분은 난이도가 더 낮은 로컬 저장후 업로드 하는 방식으로 진행하게 되었습니다. 로컬에 작성된 파일을 읽어 업로드 하는 부분은 정상적으로 작동합니다. 하지만 그 뒤에 s3.upload()의 콜백으로 나오는 data를 소켓통신으로 client에 보내주고 싶은데 그 과정에서 해결이 되지 않아 질문드립니다.

아래는 코드입니다. 파일이 3개로 분리되어 있습니다.

// models/**.js

(...)
await uploadFile(filename)

여기는 크롤후 스트림으로 파일을 저장한 후 s3.js를 부르는 부분입니다.

// s3.js

(...)
const uploadFile = async filename => {
    await fs.readFile(join(__dirname, output, filename), (err, data) => {
        s3Upload(filename, data)
    })
}

const s3Upload = async (filename, data) => {
    await s3.upload({
        Bucket: 'work543-express-crawler',
        Key: filename,
        Body: data,
        ContentEncoding: 'utf-8',
        ACL: 'public-read-write'
    }, (err, data) => data ) // <-- 이 부분
}

s3.upload()의 콜백에서 데이터를 socket.emit()으로 보내야하는데 어떻게 해야할지 갈피를 못잡고 있습니다.

// socketIo.js

(...)
const socketServer = app => {
    const socketio = require('socket.io')(app)
    socketio.on('connection', socket => {
        socket.on('append', async data => {
            queue(data)
        })
        socket.emit(someEventName, theData) // <-- 이 부분은 수도코드입니다.
    })
}

socket.emit()data가 들어가려면 어떻게 해야할지 아래와 같이 생각하고 있습니다.

  1. s3.upload()의 콜백인자인 data를 export를 해야할 것 같다.
  2. 혹은 socket.emit()s3.upload()를 연결시켜주는 어떤 이벤트를 발생시켜야 할 것 같다.

혹시 이 방향으로 하는 생각이 맞는지, 맞다면 어떻게 문제를 해결해야할지 가이드를 주시면 감사하겠습니다.

감사합니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • socket 관련해서는 정말 아무것도 모릅니다만 일단 socket emit 이라고 찾아보았고 이런게 나오는데요. https://socket.io/docs/emit-cheatsheet/ 도움이 될는지요 엽토군 2019.8.29 11:08
  • 댓글 감사합니다. 맞습니다, socket.emit(eventName, msg)가 들어갑니다. msg를 s3.upload의 콜백인자인 data를 넣고싶은데, 그러려면 제가 아는 패턴으로는 불가능해서 어떤 패턴으로 넣을 수 있는지를 여쭤보고 싶었습니다 ㅠㅠ 알 수 없는 사용자 2019.8.29 11:10
  • 사실 거기서부터는 소켓통신을 통해 클라이언트에게 뭘 보여줄거냐에 따라서 달라질 부분 같아요. 예컨대 가장 극단적인 설계는, s3 처리가 성공하기만 하면, 그냥 클라이언트에 'ok' 한마디만 날려버리는 것도 방법이거든요. s3는 성공/실패하면 뭘 돌려주나요? 클라이언트에게는 무엇이 반환되어야 하나요? 엽토군 2019.8.29 11:14
  • s3는 성공시 data 객체에 업로드된 파일정보가, 실패하면 err가 반환됩니다. 클라이언트에게는 data.Location(다운로드 링크), data.Key(파일명)이 반환되어야 합니다. 실시간으로 결과가 반영되길 원해서 소켓통신을 사용하려고 했던거거든요. 알 수 없는 사용자 2019.8.29 11:19

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)