ビューコピー#6 CRUD(2):UPLOAD(EDIT)


🔖 レッスン範囲:6.20~24

Preview


過去の時間はイタチSchema, mongoose.Model, mongoose.find, mongoose.CRUDのC,R部分を学び,findByIdなど多様なモンゴル語の手法を用いてデータを生成し,サーバにデータを格納し,データを再格納する.この過程でcallback関数とpromise構文も理解した.
watchページを作成するC、R機能の作成方法を学習した以上、
editページを作成し、U(update)機能の追加方法を学習します.

レッスン内容


1. getEdit


getEditページを作成します.
export const getEdit = async (req, res) => {
  const { id } = req.params; // const id = req.params.id; 의 es6 버전.
  const video = await Video.findById(id);
  if (!video) {
    return res.render("404", { pageTitle : "404, Not Found"});
  } 
  return res.render("edit", { pageTitle : `Edit ${video.title}`, video });
}

2. postEdit


PostEditページを作成して、データの変更を変更します.
2つの方法があります.
1)データベースから直接格納される値とreq.bodyに送信された値を取得し、変更します.
2) .findByIdAndUpadte(id,{修正する:修正})モンゴルメソッドの使用方法

2.1.1第一の方法:直接修正+。save()

 // videoController.js
 
export const postEdit = async (req, res) => {
 const { id } = req.params;
 const { title, description, hashtags } = req.body;
 const video = await Video.findById(id);
 if (!video) {
   return res.render("404", { pageTitle: "Video not found." });
 }
 video.title = title;
 video.description = description;
 video.hashtags = hashtags
   .split(",")
   .map((word) => (word.startsWith("#") ? word : `#${word}`));
 await video.save();
 return res.redirect(`/videos/${id}`);
};
  • の毎日のデータのtitle、description、hashtagsを要求します.bodyが受け取った値に変更すると
  • video.save()で終わります.
  • 2.1.2第2の方法:モンス関数を使用する:。findByIdAndUpadte() 🌟

    // videoController.js
    
    export const postEdit = async (req, res) => {
     const { id } = req.params;
     const { title, description, hashtags } = req.body;
      const video = await Video.findById(id);
      if (!video) {
       return res.render("404", { pageTitle: "Video not found." });
     }
     await Video.findByIdAndUpdate(id, {
       title,
       description,
       hashtags: hashtags
         .split(",")
         .map((word) => (word.startsWith("#") ? word : `#${word}`)),
     });
     return res.redirect(`/videos/${id}`);
    };
  • がこの方法を使用する場合.save()機能が追加されていないことを確認できます.findByIdAndUpdate()は、変更された情報を自動的にサーバに格納します.
  • は便利ですが、保存する前に=>ミドルウェアを使用して情報が正しいかどうかを入力する機能が必要です.モンゴル語でサポートされているミドルウェア機能について説明します.
    モンゴルのミドルウェア公式doc:https://mongoosejs.com/docs/middleware.html#middleware(👉 まず読んでから、以下の操作を行います)
  • 2.2.0預け入れ検査機能の追加


    2つの方法があります.
    1)モンゴル語のミドルウェア(ミドルウェア)機能を使用する
    2)モンゴルの静的(静的)機能を使用する

    2.2.1保存検証:モンゴル文ミドルウェア、schema。pre()


    ミドルウェアは、データモデルを作成するファイルによって作成されます.データモデルを作成する前に作成する必要があります.
    //Video.js
    
    videoSchema.pre("save", async function () {
    	해당 기능(여기선 save 기능) 을 사용하기 "전"(pre) 구현하고 싶은 기능 적기
    });
    //Video.js
    
    videoSchema.pre('save', async function () {
        this.hashtags = this.hashtags[0]
        .split(",")
        .map((word) => (word.startsWith("#") ? word : `#${word}`));
    });
  • は、フォームにsubmitが設定された後、constrolrでdebeに各種情報が設定されて「保存」される前に、上記ミドルウェアが自分の役割を挿入して実行する「保存」である.
  • の問題は、同じフォームsubmitであっても、アップロード、すなわちモデルが可能であることである.create()の場合、これらのミドルウェアは使用できますが、画面(モデル)を編集します.findByIdAndUpadte()は、ミドルウェアが正常に動作しているかどうかを確認する可能性があります.
    =>モデルが原因です.findByIdAndUpadate()は、4つのミドルウェアのクエリミドルウェアです.findOneAndUpdate()を読み込みます.findOneAndUpdate()はドキュメントにアクセスできません.
  • 2.2.2保存前確認:モンゴルのStatic


    .staticでは、データ型内でよく使用する関数を宣言し、使いやすくすることもできます.
    基本的には関数宣言,import,export後に使用される原理である.ただし、import、exportを必要とせず、宣言された関数名のみを使用すると便利です.
    使用方法
    1) new mongoose.Schema()を指定した後、Mongoose.model()が指定される前に以下のようにします.構文の詳細については、サイトを参照してください.
    Schema이름.static("함수명", function (인자) { 함수 커스터마이징 } );
    2)関数のモデル名を使用します.関数名(パラメータ)を使用します.終わります.
    // 예를 들면,
    
    //  static function 선언 in Video.js
    
    const videoSchema = new mongoose.Schema({
        title: { type: String, required: true, uppercase: true },
        description: { type: String, required: true },
        createdAt: { type: Date, required:true , default: Date.now },
        hashtags: [{type:String, trim:true}],
        meta: {
            views: { type: Number, default: 0 },
            rating: { type: Number, default: 0 },
        },
    });
    
    videoSchema.static("formatHashtags", function (hashtags) {
        return hashtags
        .split(",")
        .map((word) => word.startsWith("#") ? word : `#${word}`)
    });
    
    const Video = mongoose.model("Video", videoSchema);
    export default Video;
    
    
    // static function 사용 in videoController.js
    
    await Video.create ({
          title,
          description,
          hashtags: Video.formatHashtags(hashtags),
    });

    追加学習?

  • join()
  • コード:“BABEL PARSE ERROR”,原因コード:解析“UnexpectedReservicedWord”
    :通常awaitを書くときにパラメータasyncを忘れた場合、このエラーが発生します.
  • .startsWitdh("") ? :
  • サーバからデータをロードする様々なMongooseメソッド
  • .findOne(filter) vs. .findById(id):サーバからデータオブジェクトをロードします.findOneは自分でいろいろな条件を作ることができます.findById()はidで見つけることができます.
  • .≪エクスポート|Export|emdw≫:サーバーから実際のオブジェクトをロードするのではなく、true/false値を返します.
  • Middleware
  • ミドルウェア(preまたはpost hookとも呼ばれる)は、非同期関数の実行中に制御を伝達する関数である.
    モンゴル語には、ドキュメントミドルウェア、モデルミドルウェア、集約ミドルウェア、queryミドルウェアの4つのミドルウェアがあります.
    https://mongoosejs.com/docs/middleware.html#middleware
    モデルミドルウェアがサポートする機能
    document middleware関数では、現在のドキュメントを参照します.https://mongoosejs.com/docs/middleware.html#types-of-middleware
    データベースから完全なビデオを削除(2021.10.08)
    db.videos.remove({})が破棄されたと表示された場合、
    db.videos.deleteMany({})を使用して、ビデオ全体を削除します.
    Pre
    注意!preのコールバック関数に矢印関数を書き込むと、このターゲットは異なるのでfunction(){}に書き込む必要があります.
    pre("save", async () => {}); (X)
    https://mongoosejs.com/docs/middleware.html#pre
    Statics
    モデルに静的関数を追加することもできます.
    モードでコンパイルされたモデルに静的「class」メソッドを追加します.
    Staticを使用する2つの方法
    // Assign a function to the "statics" object of our animalSchema
    animalSchema.statics.findByName = function(name) {
    return this.find({ name: new RegExp(name, 'i') });
    };
    // Or, equivalently, you can call `animalSchema.static()`.
    animalSchema.static('findByBreed', function(breed) { return this.find({ breed }); });
    https://mongoosejs.com/docs/guide.html#statics

    サマリ