天天看點

【nodejs】讓nodejs像後端mvc架構(asp.net mvc )一樣處理請求--控制器的聲明定義和發現篇(3/8)前情概要basecontroller的全部代碼具體項目中controller的聲明和使用代碼controller注冊到RouteHandler

文章目錄

前情概要

前面文章把路由已經介紹的差不多了,包括url映射,路由選擇等。接下來講一講controller的一些基本規則

BaseController的所有代碼都在這裡拉。相當簡單。

主要邏輯:我們的元件接到請求後,根據url規則找到對應的controller和要處理的請求的action後,直接new一個controller出來,把req,res等對象傳遞給controller對象。并對action進行invoke(call、applay)。

basecontroller的全部代碼

import { UserInfo } from './UserInfo';
import { ViewResult } from './ViewResult';
import * as core from "express-serve-static-core";
export class BaseController {
    constructor(request: core.Request, response: core.Response) {
        this.request = request;
        this.response = response;
        var _req: any = this.request;
        this.UserInfo = _req.UserInfo;
    }
    /**
     * 目前請求的request對象
     * 
     * @type {core.Request}
     * @memberof BaseController
     */
    public request: core.Request;
    /**
     * 目前請求的response對象
     * 
     * @type {core.Response}
     * @memberof BaseController
     */
    public response: core.Response;
    /**
     * 目前登入的使用者
     * 
     * @type {UserInfo}
     * @memberof BaseController
     */
    public UserInfo: UserInfo;

    /**
     * 傳回view由視圖引擎在服務端進行渲染
     * 
     * @param {string} viewName 目前視圖的名稱
     * @param {*} [viewData] 需要傳遞給視圖的資料
     * @returns {ViewResult} 
     * @memberof BaseController
     */
    public view(viewName: string, viewData?: any): ViewResult {
        return new ViewResult(viewName, viewData)
    }
}           

是以basecontroller的結構非常簡單。隻有

構造函數:注入req,res對象

幾個屬性:req,res,userinfo

幾個方法:view 标記目前方法傳回的是一個視圖,需要在服務端進行渲染,非view傳回值都視為直接傳回給調用者。這邊模仿asp.net mvc 提供比如json,content,file等類似方法也是可以的。目前就我們自己的需求來講,也就2種,要麼在服務端進行渲染,要麼就是ajax請求。是以這裡沒有其他方法了。

具體項目中controller的聲明和使用代碼

import { Host, Site, OSType, HostEnv, Dictionary } from './../Entity';
import { BaseController, get, post, auth, actionName, ViewResult } from "gd-express-basic";
import { getMongoRepositoryAsync, FindManyOptions } from '../gd-mongo';

export class HostController extends BaseController {
    public async list() {
        var repo = await getMongoRepositoryAsync(Host);
        var b = await repo.FindAsync();
        return b
    }
    public async info() {
        var repo = await getMongoRepositoryAsync(Host);
        var b = await repo.FindAsync({ Ip: this.request.query.ip, HostEnv: this.request.query.env });
        return b
    }
    @get()
    public index() {
        return this.view("hostIndex");
        //return this.view("hostIndex", {服務端頁面渲染需要用到的資料對象});
    }
    @get()
    public hostAdd() {
        return this.view("hostAdd", {});
    }
}           

controller注冊到RouteHandler

在controller檔案夾下弄個index檔案,把controller全部聲明并導出。

【nodejs】讓nodejs像後端mvc架構(asp.net mvc )一樣處理請求--控制器的聲明定義和發現篇(3/8)前情概要basecontroller的全部代碼具體項目中controller的聲明和使用代碼controller注冊到RouteHandler

注冊到RouteHandler

import { RequestHandler, RouteHandler } from 'gd-express-basic'
const _app = express();
RouteHandler(_app, controllers);           

controller 和 action 的定義就到這裡完事了,沒啥需要特别說的。

PS:

其實這裡也是可以做自動發現的。比如:RouteHandler(_app, controllers); --> RouteHandler(_app, {controllers:"./controller/*.js"}); 也是一個不錯的方式。個人覺得controller還是不會太頻繁的增加。是以暫時也就沒做自動發現了(^_^)

繼續閱讀