オイルパイプクローンコード復習備考-2
36578 ワード
この記事は、非符号化デコーダの「オイルチューブクローン符号化」コースに基づいて作成されています.https://nomadcoders.co
サムネイル画像ソース:https://developers.google.com/youtube
最後のロケーションのベース設定とノード.JSフレームワークExpressの基礎知識を学びました.次に、Expressのrouterコンセプトを見てみましょう.
これまで、サーバは
/
リクエストを1つしか受信していませんでした.const handleHello = (req, res) => {
res.send("Hello!");
};
app.get("/", handleHello);
それでも、コードが占有するスペースはかなり大きいように見えます.コントローラが大きくなると、コードが複雑になる可能性があります.Webサービスの作成に伴い、数十~数百のパスがあれば、コードはさらに複雑になります.そのため、URLをタイプ別にグループ化できるデバイスが必要です.この話はずっと続きます
ドメイン設計
まず、ユーザーの観点からドメインを設計しましょう.YouTubeのドメインは、次の2つに分類できます.video
とuser
です.
video
はログインおよびプロファイルの管理に使用され、user
はイベントの表示、アップロードおよび削除に使用されます.各状況に合ったページを作成します.
video:
app.get()
であり、対応するコントローラと必要なミドルウェアがそれぞれ作成される場合、server.js
ファイルは非常に複雑になります.問題はURLにもあります.組織URLがないため、
/upload-video
、/delete-video
のように文字列video
を繰り返し続けなければならない.router
Expressのルータでは、子ディレクトリが親ディレクトリにあるようにURLを整理できます.
/videos/delete
の要求が受信されると、その要求は/videos
を担当するルータに送信される.ビデオルータは、/delete
コントローラを介してリクエストに応答します.const globalRouter = express.Router();
const videoRouter = express.Router();
const userRouter = express.Router();
app.use("/", globalRouter);
app.use("/videos", videoRouter);
app.use("/users", userRouter);
このプロジェクトでは、合計3つのルータが使用されます.ユーザuserRouter
、ビデオvideoRouter
、およびホームglobalRouter
.express.Router()
を使用してルータを作成します.そして、app.use()
において、ルータをパラメータとし、ルータが担当する経路を有する.
各ルータにパスを割り当てる方法は以前と同じです.const watch = (req, res) => {
res.send("Watch videos!");
};
videoRouter.get("/watch", watch);
ルータは、express app
を介して特定のパスからのリクエストを受信することができます.これまでget()
を介して特定のパスからのリクエストを受信してきたように.get()
にvideoRouter
のリクエストをもらいました.現在、ユーザが/watch
を要求すると、/videos/watch
によって処理される.
ここから見ると、各ルータの機能は「マイクロアプリケーション」のようなものです.videoRouter
は、videoRouter
、/watch
などの要求を処理できる小さなアプリケーションです.
ファイルの分割 import express from "express";
import morgan from "morgan";
const app = express();
const PORT = 4000;
const globalRouter = express.Router();
const videoRouter = express.Router();
const userRouter = express.Router();
const watch = (req, res) => {
res.send("Watch videos!");
};
videoRouter.get("/watch", watch);
app.use(morgan("dev"));
app.use("/", globalRouter);
app.use("/videos", videoRouter);
app.use("/users", userRouter);
app.listen(PORT, () => {
console.log(`Server is listening on port ${PORT}`);
});
Expressフレームワークを作成し、ルータを作成し、/edit
にvideoRouter
コントローラを一時的にインストールしました.要求をパス別に分類するためにルータを作成することが望ましいが、/watch
ファイルは複雑になる.作成したすべてのページがドメイン設計で構想されている場合は、ルータとコントローラが混在して使用するのに適していない可能性があります.
次に、ルータとルータ、コントローラ、コントローラの集合のためにプロジェクトディレクトリを再構成します.
const globalRouter = express.Router();
const videoRouter = express.Router();
const userRouter = express.Router();
app.use("/", globalRouter);
app.use("/videos", videoRouter);
app.use("/users", userRouter);
const watch = (req, res) => {
res.send("Watch videos!");
};
videoRouter.get("/watch", watch);
import express from "express";
import morgan from "morgan";
const app = express();
const PORT = 4000;
const globalRouter = express.Router();
const videoRouter = express.Router();
const userRouter = express.Router();
const watch = (req, res) => {
res.send("Watch videos!");
};
videoRouter.get("/watch", watch);
app.use(morgan("dev"));
app.use("/", globalRouter);
app.use("/videos", videoRouter);
app.use("/users", userRouter);
app.listen(PORT, () => {
console.log(`Server is listening on port ${PORT}`);
});
Expressフレームワークを作成し、ルータを作成し、/edit
にvideoRouter
コントローラを一時的にインストールしました.要求をパス別に分類するためにルータを作成することが望ましいが、/watch
ファイルは複雑になる.作成したすべてのページがドメイン設計で構想されている場合は、ルータとコントローラが混在して使用するのに適していない可能性があります.次に、ルータとルータ、コントローラ、コントローラの集合のためにプロジェクトディレクトリを再構成します.
server.js
フォルダにsrc
フォルダとrouters
フォルダを作成します.controllers
フォルダにrouters
、globalRouter.js
、videoRouter.js
、およびuserRouter.js
ファイルを作成します.controllers
フォルダにvideoController.js
およびuserController.js
ファイルを作成します.controllers
フォルダにglobalController.js
を作成しないのは、ホームページに表示されるコンテンツのタイプが最終的にユーザーまたはビデオに関連しているためです.server.js
に書かれたルータに関連するコードを各ファイルに移動します.globalRouter
を例に説明する.import express from "express";
const globalRouter = express.Router();
export default globalRouter;
ルータもExpressの機能であるため、expressがロードされます.globalRouter
が作成され、export
から読み込まれます.この操作は、
server.js
およびvideoRouter
に対して繰り返される.その後、
userRouter
から冗長コードを削除し、すべてのルータにロードします.import express from "express";
import morgan from "morgan";
import globalRouter from "./routers/globalRouter";
import videoRouter from "./routers/videoRouter";
import userRouter from "./routers/userRouter";
const app = express();
const PORT = 4000;
app.use(morgan("dev"));
app.use("/", globalRouter);
app.use("/videos", videoRouter);
app.use("/users", userRouter);
app.listen(PORT, () => {
console.log(`Server is listening on port ${PORT}`);
});
書類がもっときれいになる.ルータせっけい
次に、ファイルを整理し、各ルータの構造を設計します.現在の状況では、大まかな方向だけを作成し、修正を継続する計画です.
globalRouter
server.js
は、メイン画面に関連するページを集約するルータです.次のことができます.globalRouter.get("/", trending);
globalRouter.get("/join", join);
globalRouter.get("/login", login);
globalRouter.get("/search", search);
ユーザーがホームページにアクセスすると、YouTubeに人気ビデオのリストが表示されます.これはglobalRouter
コントローラが担当します.また、登録、ログイン、検索などの機能がホームページに入る可能性があります.
videoRouter
videoRouter.get("/upload", upload);
videoRouter.get("/:id", see);
videoRouter.get("/:id/edit", edit);
videoRouter.get("/:id/delete", deleteVideo);
ビデオには、アップロード、表示、変更、削除機能がある場合があります.
ここでtrending
と書いてある部分がURLパラメータです.YouTubeのすべてのビデオには、ビデオとメッセージを見ることができるページがありますが、グーグルがすべてのビデオのために直接ページを作ることができるという意味ではありません./:id
は、ビデオのid値を含み、ビデオに関連するすべてのデータを予め作成されたテンプレートページに埋め込む.このセクションでは、データベースのセクションで詳しく説明します.
userRouter
userRouter.get("/logout", logout);
userRouter.get("/edit", edit);
userRouter.get("/remove", remove);
userRouter.get("/:id", see);
ユーザー関連機能には、ログアウト、ユーザープロファイルの変更、会員の脱退、プロファイルの表示が含まれます.ビデオと同様に、データベースからユーザ情報をロードする際に、より詳細に説明します.
コントローラの接続
各ルータを設計する際に、各リクエストおよびURLを処理するためのコントローラ関数を渡します.コントローラを一時的に作成しましょう.
userController
export const join = (req, res) => res.send("Join");
export const login = (req, res) => res.send("Login");
export const edit = (req, res) => res.send("Edit user");
export const remove = (req, res) => res.send("Remove user");
export const logout = (req, res) => res.send("Logout user");
export const see = (req, res) => res.send("See user");
すべてのコントローラは、ルータ/:id
に使用することができる.ここで、export
およびjoin
はlogin
を使用し、残りのコントローラはglobalRouter
を使用する.
videoController
export const trending = (req, res) => res.send("trending");
export const see = (req, res) => res.send("watch");
export const edit = (req, res) => res.send("edit");
export const search = (req, res) => res.send("Search");
export const upload = (req, res) => res.send("upload");
export const deleteVideo = (req, res) => res.send("deleteVideo");
同様に、すべてのコントローラはuserRouter
に構成されています.export
はtrending
によってもたらされる.残りのコントローラはglobalRouter
によって使用される.
ルータからインポート
各ルータは、videoRouter
フォルダに作成されたコントローラを使用する必要があります.import express from "express";
import { trending, search } from "../controllers/videoContoller";
import { join, login } from "../controllers/userContoller";
const globalRouter = express.Router();
globalRouter.get("/", trending);
globalRouter.get("/join", join);
globalRouter.get("/login", login);
globalRouter.get("/search", search);
export default globalRouter;
controllers
は、次のコントローラを使用します.他のコントローラもそうです.import express from "express";
import { logout, edit, remove, see } from "../controllers/userContoller";
const userRouter = express.Router();
userRouter.get("/logout", logout);
userRouter.get("/edit", edit);
userRouter.get("/remove", remove);
userRouter.get("/:id", see);
export default userRouter;
import express from "express";
import { upload, see, edit, deleteVideo } from "../controllers/videoContoller";
const videoRouter = express.Router();
videoRouter.get("/upload", upload);
videoRouter.get("/:id", see);
videoRouter.get("/:id/edit", edit);
videoRouter.get("/:id/delete", deleteVideo);
export default videoRouter;
現在、このプロジェクトのルータの設計はすでに一定の輪郭を持っている.この点は変更を続け、将来的にはデータベースをバインドしてHTMLをレンダリングします.
以下では、pugを使用してサーバ上でHTMLを効率的にレンダリングする方法について説明します.
<参考文献>
globalRouter.get("/", trending);
globalRouter.get("/join", join);
globalRouter.get("/login", login);
globalRouter.get("/search", search);
videoRouter.get("/upload", upload);
videoRouter.get("/:id", see);
videoRouter.get("/:id/edit", edit);
videoRouter.get("/:id/delete", deleteVideo);
userRouter.get("/logout", logout);
userRouter.get("/edit", edit);
userRouter.get("/remove", remove);
userRouter.get("/:id", see);
各ルータを設計する際に、各リクエストおよびURLを処理するためのコントローラ関数を渡します.コントローラを一時的に作成しましょう.
userController
export const join = (req, res) => res.send("Join");
export const login = (req, res) => res.send("Login");
export const edit = (req, res) => res.send("Edit user");
export const remove = (req, res) => res.send("Remove user");
export const logout = (req, res) => res.send("Logout user");
export const see = (req, res) => res.send("See user");
すべてのコントローラは、ルータ/:id
に使用することができる.ここで、export
およびjoin
はlogin
を使用し、残りのコントローラはglobalRouter
を使用する.videoController
export const trending = (req, res) => res.send("trending");
export const see = (req, res) => res.send("watch");
export const edit = (req, res) => res.send("edit");
export const search = (req, res) => res.send("Search");
export const upload = (req, res) => res.send("upload");
export const deleteVideo = (req, res) => res.send("deleteVideo");
同様に、すべてのコントローラはuserRouter
に構成されています.export
はtrending
によってもたらされる.残りのコントローラはglobalRouter
によって使用される.ルータからインポート
各ルータは、
videoRouter
フォルダに作成されたコントローラを使用する必要があります.import express from "express";
import { trending, search } from "../controllers/videoContoller";
import { join, login } from "../controllers/userContoller";
const globalRouter = express.Router();
globalRouter.get("/", trending);
globalRouter.get("/join", join);
globalRouter.get("/login", login);
globalRouter.get("/search", search);
export default globalRouter;
controllers
は、次のコントローラを使用します.他のコントローラもそうです.import express from "express";
import { logout, edit, remove, see } from "../controllers/userContoller";
const userRouter = express.Router();
userRouter.get("/logout", logout);
userRouter.get("/edit", edit);
userRouter.get("/remove", remove);
userRouter.get("/:id", see);
export default userRouter;
import express from "express";
import { upload, see, edit, deleteVideo } from "../controllers/videoContoller";
const videoRouter = express.Router();
videoRouter.get("/upload", upload);
videoRouter.get("/:id", see);
videoRouter.get("/:id/edit", edit);
videoRouter.get("/:id/delete", deleteVideo);
export default videoRouter;
現在、このプロジェクトのルータの設計はすでに一定の輪郭を持っている.この点は変更を続け、将来的にはデータベースをバインドしてHTMLをレンダリングします.以下では、pugを使用してサーバ上でHTMLを効率的にレンダリングする方法について説明します.
<参考文献>
Reference
この問題について(オイルパイプクローンコード復習備考-2), 我々は、より多くの情報をここで見つけました https://velog.io/@soonitoon/유튜브-클론코딩-복습노트-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol