import { IProductModel, ProductModel } from "@/model/product";
import { Knex } from "knex";
export interface ModelContext {
productModel: IProductModel;
}
定義一個介面 ModelContext,包含 productModel 屬性,類型為 IProductModel。
export const modelManager = ({ knexSql }: { knexSql: Knex }): ModelContext => {
const productModel = ProductModel.createModel({ knexSql });
return { productModel };
}
import { ModelContext, modelManager } from './manager/modelManager';//新增
class App {
private modelCtx: ModelContext;//新增
constructor() {
this.modelCtx = modelManager({ knexSql: this.knexSql });//新增
}
import { ModelContext, modelManager } from './manager/modelManager';
目的是從指定的路徑(./manager/modelManager)匯入兩個模組:ModelContext 和 modelManager。
2. 類別定義:
class App {
private modelCtx: ModelContext;
目的是在 App
類別中定義一個私有屬性 modelCtx
,它的類型為 ModelContext
。主要用途:
3.建構函數:
constructor() {
this.modelCtx = modelManager({ knexSql: this.knexSql });
}
目的是在 App
類別的建構函數中初始化資料模型上下文。
1.匯入模組:
import { IProductModel } from "@/model/product";
import { NextFunction, Request, Response } from "express";
2.定義介面 IProductController
:
export interface IProductController {
//使用express.js的router API
findAll(req: Request<any, any, any, any>,
res: Response,
_next: NextFunction): void;
}
3.定義 ProductController
類別:
export class ProductController {
private productModel: IProductModel;
constructor({ productModel }: { productModel: IProductModel }) {
this.productModel = productModel;
}
//傳到前端
findAll: IProductController["findAll"] = async (_req, res, _next) => {
const result = await this.productModel.findAll();
res.json(result);
}
}
//類別定義:
export class ProductController {
private productModel: IProductModel;
constructor({ productModel }: { productModel: IProductModel }) {
this.productModel = productModel;
}
findAll: IProductController["findAll"] = async (_req, res, _next) => {
const result = await this.productModel.findAll();
res.json(result);
}
這樣的命名通常表示這個參數在方法中沒有被使用。這是開發者的一種慣例,用 _
作為前綴來表明這個參數在函數或方法中是未使用的,但依然需要保留它作為函數簽名的一部分。
ProductControllerProp
介面,確保傳遞的資料正確無誤:1.定義 ProductControllerProp
介面:
interface ProductControllerProp {
productModel: IProductModel;
}
ProductControllerProp
中,它代表了傳遞給 ProductController
的屬性集合。2.靜態方法 createConstructor:
public static createConstructor({ productModel }: ProductControllerProp) {
return new ProductController({ productModel });
}
1.匯入模組:
import { ProductController, IProductController } from "@/controller/productController";
import { ModelContext } from "./modelManager"
2.定義 ControllerContext
介面:
export interface ControllerContext {
productController: IProductController;
}
IProductController
。3.定義 controllerManager
函數:
export const controllerManger = ({
modelCtx
}: {
modelCtx: ModelContext;
}): ControllerContext => {
const productController = ProductController.createConstructor({ productModel: modelCtx.productModel });
return {
productController
}
ProductController
實例:使用靜態方法 createConstructor 來創建 ProductController 的實例,並將 modelCtx 中的 productModel 傳遞給它。ProductController
和 controllerManager
加入 app.ts
為的是將這些控制器註冊到應用程式中,確保它們能夠處理來自客戶端的請求:import { ControllerContext } from './manager/controllerManager';//新增
class App {
controllerCtx: ControllerContext;//新增
constructor() {
this.controllerCtx = controllerManger({ modelCtx: this.modelCtx })//新增
}
1.匯入模組:
import { ControllerContext } from './manager/controllerManager';
2.定義 App
類別:
class App {
controllerCtx: ControllerContext;
3.建構函數:
constructor() {
this.controllerCtx = controllerManger({ modelCtx: this.modelCtx });
}