チームプロジェクトfor-rest 5週目


インポート


もうすぐ来週終わる時間だプロジェクトをすばやく完成したいのですが、まだ完成していません.今週はラストスパートを頑張ります.今週、ローカルで反応項目を構築し、heroku環境変数でfirebase admin keyを非表示にし、衝突を解決しようとしました.場所でいいねをつけるAPI機能も作成されています.

heroku環境変数を使用してFirebase Admin Keyファイルのハブで非表示にする


最初からFirebase鍵をハブに隠そうと思っていましたが、方法を探しているうちに、今日やっと解決しました.方法は、プロジェクトがherokuから構築されたときにfirebase adminキー値を含むjsonファイルを作成するためにheroku環境変数を使用します.
順番に方法を説明します.
  • まずHerokuで自分のプロジェクトに入ります.
  • 右上隅からSettingsに入ります.
  • Reveal Config Varsというボタンがあります.このボタンをクリックすると、Firebase Adminキー値がJSONファイル全体に格納されます.
  • プロセスが完了している場合は、ほとんど完了しています.
    今回はProcfileを修正します.
    web sh -c 'echo ${FIREBASE_ADMIN_KEY} >> ./firebase.json && java -Dserver.port=$PORT $JAVA_OPTS -Dspring.profiles.active=prod-jar build/libs/heroku-sample-0.0.1-SNAPSHOT.jar'
    ここではProcfileについて簡単に説明します.ProcfileはHerokuの構築と実行プロセスを含むファイルです.
    ProcFileはwebという言葉で始まる必要があります.ここでは、sh-cを使用してbashコマンドを挿入できます.ここで、sh-cの役割は、「」でコマンドをまとめることです.
    echo ${FIREBASE_ADMIN_KEY} >> ./firebase.jsonコマンドは、herokuで設定したFIREBASE ADMIN KEYをに設定します./firebase.jsonファイルに保存されていることを示します.

    Reactプロジェクトのローカル構築


    Reactプロジェクトをローカルで構築するには、「Node」を選択します.jsをインストールする必要があります.npmもインストールする必要がありますが、node.jsをインストールすると、自動的にインストールされます.

    バージョンを確認しながら、node-v、npm-vが正しく敷かれているかどうかを確認できます.
      cd frontend
      npm install
      npm run build
      cd ..
      mkdir src/main/resources/static/
      cp -r frontend/build/* src/main/resources/static/
    npm run buildコマンドを使用して、フロントエンドプロジェクトを作成して構築ファイルを作成できます.

    発生したエラー


    ログ関連エラー

     error: cannot find symbol
    
            log.info("test log");
    
            ^
    
      symbol:   variable log
    テストコードを作成するときにログを使用するときに上記のエラーが発生しました.buildはこのエラーを解決します.gradeファイルで
    testAnnotationProcessor 'org.projectlombok:lombok'
    コードを書けばいいです.
    テスト環境ではなくローカル環境でエラーが発生した場合、
    annotationProcessor 'org.projectlombok:lombok'
    以上のコードを追加すればいいです.

    @BeforeAll関連エラー


    @BeforeAllノイズの実行中にエラーが発生しました.

    BeforeAll() throws java.lang.Exception' must be static


    このエラーの内容は、BeforeAllというメソッドをstaticとして宣言する必要があることを意味します.これらの内容を適用し、staticを次のように貼り付けて問題を解決します.
        @BeforeAll
        public static void BeforeEach() throws Exception {
            log.info(" 통과 ");
        }

    @ResponseBodyが使用されていないためのエラー


    リクエストを受信してクライアントに送信した場合、@ResponseBodyを使用しないため、JavaオブジェクトのLongタイプに関するエラーが発生します.この問題を解決するには@ResponseBody操作が必要であり、操作の役割はJavaオブジェクトをHTTP応答本体のオブジェクトに変換してクライアントに送信する.@ResponseBodyプレゼンテーションを頻繁に使用する場合は、@RestControllerプレゼンテーションを使用できます.@RestControllerは、この宣言を別途設定することなく、戻り値に@ResponseBody宣言を追加します.

    Firebaseログインエラー


    今週、私たちはついにフロントエンドとバックエンドプロジェクトを統合し、HAROKUに配備しました.でもログイン連動でたくさんのタックルをしましたが、この問題を解決してくれて本当に嬉しかったです.
    まず、最初に発生したエラーは、フロントエンドで伝達された値がベアラを含まないためのエラーです.
    jwtFilterでは、要求ヘッダ部分のAthorization値に、その部分が存在するかどうかを確認するためのベアラが含まれていますが、欠落しているため無効なトークンエラーが発生し、フロントエンドで変更されました.
    そして私は間違いに遭遇しました.今回のコインは無効です.
    エラーは次のとおりです.
    com.google.firebase.auth.FirebaseAuthException: Firebase ID token has incorrect "aud"(audience) claim. Expected "for-rest-7f9d8"but got "652669951852-qpk8g3597toibf3mnnlhqoakij2evup6.apps.googleusercontent.com". Make sure the ID token comes from the same Firebase project as the service account used to authenticate this SDK. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.
    エラーが検出されると、バックエンドプロジェクトとフロントエンドプロジェクトは、同じインフラストラクチャで作成されたKey値を使用する必要があることに気づきました.
    しかし、エラーはまだ解決されていません.ここからはうまくいかなかったので指導者の助けを得ました
    問題の原因は、フロントエンドで直接証明書を使用することです.したがって、FirebaseユーザオブジェクトからgetidTokenでタグをインポートすることで問題を解決します.

    ほめ方


    「好き」(OK)をクリックしてplaceId値をpathVariableとしてgetで受信します.その後、サービスを通じてユーザ情報とplaceIdが伝達される.そして、サービスはあなたが「好き」をクリックしたかどうかをチェックします.
     // 좋아요를 이미 누른 상태인지 확인
            Optional<Love> result = loveRepository.findByMemberAndPlace(member,place);
    「好き」をクリックした場合は、PlaceのlikeCountから1を減算し、loveテーブルから「好き」をクリックした情報を削除します.逆に、「好き」の情報がクリックされていない場合は、likeCount値を1に増やし、loveテーブルに特定の場所で「好き」をクリックした情報を格納します.
            // 좋아요를 처음 누른 경우
            if(!result.isPresent())
            {
                Love love = Love.builder()
                        .member(member)
                        .place(place)
                        .build();
    
                // 좋아요를 증가 시킴
                PlaceRepository.plusLikeCount(PlaceId);
                return loveRepository.save(love).getId();
            }
            // 좋아요를 이미 누른 경우 좋아요를 해제
            else{
                // Place의 likeCount 값 에서 1을 빼준다.
                PlaceRepository.minusLikeCount(PlaceId);
                Love love = result.get();
                loveRepository.delete(love);
                return love.getId();
            }