航行第3期第4週WIL 2021.10.04~2021.10.11


2021.10.04


テストコードを作成しています...
基本的に、確かに戻ってきたものは、テストコードを書くのが便利になったようです.
例えばこのようなノガダのようなテストコードは...
しかし,ルーティングの関数に入るのはまだ少し難しい.
const { signupPost } = require('./signupPost');
const signupAuth = require('./signupValidation');

jest.mock('../../../models/user')
const users = require('../../../models/user');

let id = 'a1A'
let pw = 'b2B2'
let pwCheck = 'b2B2'

test('아이디, 비밀번호, 비밀번호 재확인을 입력하고 가입하기를 누르면 리스폰스를 보내준다.',async()=>{
    const mockedSend = jest.fn();
    const req = {
        body:{
            id:id,
            pw,pw,
            pwCheck:pwCheck,
        }
    }
    const res = {
        send:mockedSend,
    }
    const next = jest.fn();
    await signupPost(req,res,next);
    expect(mockedSend).toBeCalledWith({
        result: 'success'
    })
})
この部分は間違っている.

このようなエラーが発生すると、失敗します.
エラーが発生した部分はdbでfind操作を行ったときにエラーが発生した可能性がありますが、まだ不明です.

エラーを解決しました.このコードは悪い論理を持っています.
最初にfindを使用すると、結果は配列に戻り、空の配列になります!isExistにはなっていないのでfindOneでこの部分を解決し、検索がなければnull値を返すのでisExist.lengthは動作しない場合があるので、削除しました.
exprts.signinPost = async (req, res, next) => {
    const { id, pw } = req.body;
    try {
        let isExist = await users.find({ id, pw });
        if (isExist.length) {
            let accessToken = tokenController.generateAccessToken(id);
            await res.cookie('login_token', accessToken, {
                maxAge: 50 * 60 * 1000,
                httpOnly: true,
            });
            res.send({ result: 'success' });
        } else {
            res.send({ result: 'Fail' });
        }
    } catch (err) {
        next(err);
    }
};
これは本コードの最新バージョンで、本来実行していた本コードのブラウザでの動作も関係ありませんが、テストコードを作成する際に、無理に実行していたコードがスムーズになったようなので気分がよくなりました.
指導者が来て、いくつかの質問をしました.
彼は再構築に関する質問に詳しく答えたが、最近controllerとrouterを分けていないことを覚えている.それなら、サービスでビジネスロジックに関連する友人を組織し、残りの関数をrouterに置きます.
ドキュメントのように特定の機能を表示するには、テストコードの数が少ない場合にのみ、for文を書く必要がある場合にのみreduceとsnapshotを使用します.
まだまだ勉強したいキーワードがたくさんあります
bdd,Elastic Stack,Promisol,Promiss Race,
アマゾンでリレーショナルデータを使用する場合はrdsを使用します
HTTPエラーに関するboom、
logginライブラリWinstonなど.
これらは後で自分で応用を勉強します.
テストコードがまたエラーになりました.
この問題は分かりやすいが、解決方法が分からないので、大変だ.これは、既存のdbにアクセスするのではなく、mocking dbを使用しているため、データがないため、find時に重複する値がないようです.どうやって解決するのか...?

2021.10.05


mockingメソッドから値を返す場合は、mockReturnValueメソッドを使用します.
最初のテストコード(プレイヤーが見つかったら、いなければ成功したテストに戻る)もこれをしました.
await users.findOne.mockReturnValue(null)
この文を追加すると、偽の戻り値が指定されます.
私の能力はまだ足りないと思います.これ以上テストコードを実施できないので、サーバーに対する理解度とコードに対する理解度をさらに高め、後で挑戦すべきだと思います.
指導者との会話で、テストコードを書くときにdbに影響を及ぼすものを削除したり、mockを使うともっと良くなり、クエリーなどtest dbを使う方法もあります.この部分はもう少し理解してから、その前にmysqlで現在作成中のmongoseコードを修正する必要があります.
mysqlをインストールして勉強しています.
演算子が多い.条件が必要なときにやってみます.
Gitは慣例としてcommit messageを使用すべきである.
feat:新機能の追加
修正しゅうふく:エラーの修正ふぁいるのしゅうふく
docs:ドキュメントの変更
style:コードのフォーマット、セミコロンの欠落、コードの変更なし
リビルドリビルド:コードリビルドコードリビルド
test:テストコードの追加、テストコードの再構築
chore:構築作業の変更、パッケージマネージャの変更
タイトルは50文字未満で、文末に句点をつけず、過去の時態を使わず、コマンドで書く
タイトル以外の詳細については、この文書に詳細を記入してください.
例:[feat]comment CRUD機能の追加

2021.10.06


mysql変換では、クエリー文をsequelize構文に変換し、find->findAll、findOneなどの置換と検索、whereの追加などの操作を行います.でも.

こんな間違いがあったら、もう一度聞いてみます.
誤字です.typeをtpeeと書きました.
を行ないます.

このようなエラーが発生しました.関連する部分でエラーが発生したようです.
foreignKeyを使用できるsourceKeyはprimaryKeyオプションtrueを使用する必要があるため、userId primaryKey:trueを与えると解決します.
この部分では、どうせuserIdは重複しないし、IDを変えることもできないのでprimaryKeyであげても大丈夫なのでtrueをあげました.その後、1つのテーブルしか生成されない現象が続いています.これは、貼り付け時にmodelNameとtableNameが重なったため、1つのテーブルしか生成されません.この部分はuserです.jsを注釈処理して実験した結果、userと命名されたテーブルも見られたのでわかりました!
でも今日は嬉しいことに一人でいろいろ闻いてみました.
JavaScriptで
&&演算子(and)の場合、前の値と後の値が両方とも本物である場合、後の値が返されます.
偽物であれば、後の値段が戻ってきます.
return consdition1 && condition2 && result
|演算子(or)では、左側の値が偽の場合、右側の値を返します.
「|0|」「Hi」|「t 1」の場合、Hiは戻る
mongoseを利用した検索が続編になりました

2021.10.07


今日は本当に勉強ができない一日でした.
joiモジュールを使用してschemaを検証するためにjoiファイルを作成し、ミラーリングしました.
const Joi = require('joi');

const joiSchema = {
    Joi,
    loginSchema: Joi.object({
        userId: Joi.string().min(1).required(),
        pw: Joi.string().min(1).required(),
    }),
    signupSchema: Joi.object({
        userId: Joi.string()
            .required()
            .min(3)
            .pattern(/^[a-zA-Z0-9가-힣]{3,}$/),
        pw: Joi.string()
            .required()
            .min(4)
            .pattern(/^[a-zA-Z0-9]{4,}$/),
        pwCheck: Joi.ref('pw')
    }),
    commentSchema: Joi.object({
        commentId: Joi.number().min(1),
        cardId: Joi.number().min(1),
        comment: Joi.string().required(),
        commentDepth: Joi.number().default(0),
    }),
    cardSchema: Joi.object({
        title: Joi.string().min(1).required(),
        desc: Joi.string().min(1).required(),
        pw: Joi.string().min(1).required(),
    }),
    likeSchema: Joi.object({
        cardId: Joi.string().min(1).required(),
    }),
};

module.exports = joiSchema;
ジョイもrefをして同じbeliedationの仕事をすることができることを知っています.

2021.10.08


今日は勉強の代わりに、まだ宿題が終わっていない人に少し誤り訂正と誘導をして、私の勉強は少しmysqlクエリーを勉強して、アルゴリズムの問題を少ししました.
問題の説明
多くのマラソン選手がマラソンに参加した.1人の選手を除いて、すべての選手がマラソンを完走した.
マラソンに出場する選手の名前と完走した選手の名前の並びが完成したら、完走していない選手の名前を返す解決関数を書いてください.
let participant = ['leo', 'kiki', 'eden'];
let completion = ['eden', 'kiki'];

function solution(participant, completion) {
    const hashMap = new Map();
    // console.log(hashMap)
    participant.forEach( p => {
        const isExist = hashMap.get(p) //p값이 있는지 확인함
        // console.log(isExist);
        if ( !isExist ) { //없으면
            hashMap.set(p,1) // key값으로 p를, value값으로 1을 줌
            // console.log(hashMap) 
            return
        }
        hashMap.set(p,isExist+1) //있으면 value값 +1
    })
    for ( const c of completion ) { 
        const pNum = hashMap.get(c);//c값이 있는지 확인
        // console.log(pNum);
        hashMap.set(c,pNum-1); //c값이 hashMap에 있으면 value를 -1
        // console.log(hashMap);
    }
    for ( const [ key, value ] of hashMap ) { //hashMap의 키,밸류값을 for문으로 돌림
        if ( value !== 0 ) { //겹치지 않으면 value가 1이 될것임
            return key //겹치지 않는값 출력
        }
    }
}

console.log(solution(participant,completion));

2021.10.09


今日は寝るTILで単独で作ったので参考にしてください!
20201.10.09-TIL