文章目錄
前情概要
前面文章把路由已經介紹的差不多了,包括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全部聲明并導出。

注冊到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還是不會太頻繁的增加。是以暫時也就沒做自動發現了(^_^)