[TIL]トラブルシューティング、実戦プロジェクト計画、テストコード、MongoDB

7707 ワード

考えてみろ


質問する


入室人数を集計する場合は、socketサーバ上の人数、client上の人数、DB上の人数を同期します.

プロセス


クライアントが部屋へのアクセスとAPIのチェックアウトを要求するたびに、データベースは人員数を更新します.この場合、同期が壊れる可能性がある場合があります.
  • ルームカードをクリックするのではなく、リンクを入力して部屋に入る場合
  • 退出ボタンではなく、後退または窓を閉じる部屋を出る場合
  • .

    解決する


    クライアントのAPIリクエストではなく、socketサーバで発生したイベントに基づいて、データベースにアクセスして人数を更新する方法で変更します.このようにして、socketに接続する場合と接続を切断する場合とで、ユーザ数を同期することができる.

    実戦種目がこれから3週間行われることを考えてみましょう。


    秘密の部屋、共有リンク、招待機能
    リンクにアクセスするにはログインが必要です
    切り替えて部屋に入る
    無限スクロール
    コードテスト後の自動配置機能(CI/CD補充)
    ビデオ通話サービスの不安定性の解決
    Peer.けんさ
    Googleでユーザーを統計
    Googleフォームからユーザーフィードバックを取得
    ビデオとタイマーの機能強化
    複数機器対応(ディスプレイサイズ、iPad)

    テストコードの作成

    it('내가 일주일에 몇 일 운동했는지 알 수 있다.', async () => {
            // 두 날짜 사이의 랜덤 날짜 생성 함수
            function randomDate(start, end) {
                return new Date(
                    start.getTime() +
                        Math.random() * (end.getTime() - start.getTime())
                )
            }
    
            const weekStart = moment().startOf('isoWeek').toDate()
    
            // 5개의 랜덤 데이터
            const recordsDays = []
            for (let i = 0; i < 5; i++) {
                const record = await WorkOutTime.create({
                    userId,
                    createdAt: randomDate(weekStart, new Date()),
                })
                recordsDays.push(record.createdAt.getDay())
            }
    
            const countPerWeek = new Set(recordsDays).size
    
            const response = await request(app)
                .get('/myinfo/statistics')
                .set('Authorization', 'Bearer ' + token)
    
            await WorkOutTime.deleteMany({ userId })
            
            expect(response.body.countPerWeek === countPerWeek).equal(true)
        })

    MongoDBの参照


    https://velog.io/@fancyer/MongoDB%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C