middleware & static

funco247·2022년 1월 11일
0

Database

목록 보기
5/9

mongoose에서 middleware란?

데이터 전송 과정에서의 전처리 (hooks)

메소드를 만들땐, 스키마를 모델화 하기 전에 정의한다.

https://mongoosejs.com/docs/middleware.html <- docs

Middleware (also called pre and post hooks) are functions which are passed control during execution of asynchronous functions. Middleware is specified on the schema level and is useful for writing plugins.

const schema = new Schema(..);

schema.pre('save', async function() {
	console.log("I am uploading", this); // 'this' in mongoDB midleware means document that is treated now 
});

const Model = mongoose.model("model", schema);
export default Model;

메소드를 model.js 안에 스키마와 함께 만들면, 데이터를 활용해 하는 각 작업마다 이름을 붙일 수 있고 controller와 분리하여 가독성에도 도움이 된다.

static - wetube 예제 코드

import mongoose from "mongoose";

//define shape of model
const videoSchema = new mongoose.Schema({
  title: { type: String, required: true, trim: true, maxLength: 50 },
  description: { type: String, required: true, trim: true, maxLength: 100 },
  createdAt: { type: Date, required: true, default: Date.now },
  hashtags: [{ type: String, trim: true }], // save as array type
  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;

videocontroller에는 upload에 대한 post / get 컨트롤러가 있다.
.static을 이용하여 hashtags의 처리 메소드를 정의해주면 컨트롤러 파일에서 Video 모델을 import 했을때 Video.의 형태로 불러서 사용할 수 있다.

import Video from "../models/Video";

export const postUpload = async (req, res) => {
  
  const { title, description, hashtags } = req.body;
  const video = new Video({
    title,
    description,
    hashtags: Video.formatHashtags(hashtags),
  });
  try {
    await video.save();
    return res.redirect("/");
  } catch (err) {
    return res.render("upload", {
      pageTitle: "upload",
      fakeUser,
      errorMessage: err._message,
    });
  }
};

/upload 페이지 form 에서 post 요청을 받으면
hashtags 변수를 받아 Video 모델 안에 있는 formatHashtags를 메소드를 부른다.

profile
단순 지적과 가르침은 다르지만 둘 다 환영합니다.

0개의 댓글