controller(控制器類)

2021-09-17 14:29 更新

think.controller.base 繼承自 think.http.base 類。項目里的控制器需要繼承該類。

使用 ES6 的語法繼承該類
export default class extends think.controller.base {
  indexAction(){

  }
}
使用普通方式繼承該類
module.exports = think.controller({
  indexAction(){

  }
})

屬性

controller.http

傳遞進來的 http 對象。

方法

controller.ip()

  • return {String}

獲取當前請求用戶的 ip,等同與 http.ip 方法。

export default class extends think.controller.base {
  indexAction(){
    let ip = this.ip();
  }
}

controller.method()

  • return {String}

獲取當前請求的類型,轉(zhuǎn)化為小寫。

export default class extends think.controller.base {
  indexAction(){
    let method = this.method(); //get or post ...
  }
}

controller.isMethod(method)

  • method {String} 類型
  • return {Boolean}

判斷當前的請求類型是否是指定的類型。

controller.isGet()

  • return {Boolean}

判斷是否是 GET 請求。

controller.isPost()

  • return {Boolean}

判斷是否是 POST 請求。

controller.isAjax(method)

  • method {String}
  • return {Boolean}

判斷是否是 Ajax 請求。如果指定了 method,那么請求類型也要相同。

export default class extends think.controller.base {
  indexAction(){
    //是ajax 且請求類型是 POST
    let isAjax = this.isAjax("post");
  }
}

controller.isWebSocket()

  • return {Boolean}

是否是 websocket 請求。

controller.isCli()

  • return {Boolean}

是否是命令行下調(diào)用。

controller.isJsonp(callback)

  • callback {String} callback 名稱
  • return {Boolean}

是否是 jsonp 請求。

controller.get(name)

  • name {String} 參數(shù)名

獲取 GET 參數(shù)值。

export default class extends think.controller.base {
  indexAction(){
    //獲取一個參數(shù)值
    let value = this.get("xxx");
    //獲取所有的參數(shù)值
    let values = this.get();
  }
}

controller.post(name)

  • name {String} 參數(shù)名

獲取 POST 提交的參數(shù)。

export default class extends think.controller.base {
  indexAction(){
    //獲取一個參數(shù)值
    let value = this.post("xxx");
    //獲取所有的 POST 參數(shù)值
    let values = this.post();
  }
}

controller.param(name)

  • name {String} 參數(shù)名

獲取參數(shù)值,優(yōu)先從 POST 里獲取,如果取不到再從 GET 里獲取。

controller.file(name)

  • name {String} 上傳文件對應的字段名

獲取上傳的文件,返回值是個對象,包含下面的屬性:

{
  fieldName: "file", //表單字段名稱
  originalFilename: filename, //原始的文件名
  path: filepath, //文件保存的臨時路徑,使用時需要將其移動到項目里的目錄,否則請求結(jié)束時會被刪除
  size: 1000 //文件大小
}

如果文件不存在,那么值為一個空對象 {}。

controller.header(name, value)

  • name {String} header 名
  • value {String} header 值

獲取或者設置 header。

export default class extends think.controller.base {
  indexAction(){
    let accept = this.header("accept"); //獲取 header
    this.header("X-NAME", "thinks"); //設置 header
  }
}

controller.expires(time)

  • time {Number} 過期時間,單位為秒

強緩存,設置 Cache-Control 和 Expires 頭信息。

export default class extends think.controller.base {
  indexAction(){
    this.expires(86400); //設置過期時間為 1 天。
  }
}

controller.userAgent()

獲取 userAgent。

controller.referrer(onlyHost)

  • referrer {Boolean} 是否只需要 host

獲取 referrer。

controller.cookie(name, value, options)

  • name {String} cookie 名
  • value {String} cookie 值
  • options {Object}

獲取或者設置 cookie。

export default class extends think.controller.base {
  indexAction(){
    //獲取 cookie 值
    let value = this.cookie("think_name");
  }
}
export default class extends think.controller.base {
  indexAction(){
    //設置 cookie 值
    this.cookie("think_name", value, {
      timeout: 3600 * 24 * 7 //有效期為一周
    });
  }
}

controller.session(name, value)

  • name {String} session 名
  • value {Mixed} session 值
  • return {Promise}

讀取、設置和清除 session。

讀取 Session
export default class extends think.controller.base {
  * indexAction(){
    //獲取session
    let value = yield this.session("userInfo");
  }
}
設置 Session
export default class extends think.controller.base {
  * indexAction(){
    //設置 session
    yield this.session("userInfo", data);
  }
}
清除 Session
export default class extends think.controller.base {
  * indexAction(){
    //清除當前用戶的 session
    yield this.session();
  }
}

controller.lang(lang, asViewPath)

  • lang {String} 要設置的語言
  • asViewPath {Boolean} 是否在模版目錄添加一層語言目錄

讀取或者設置語言。

controller.locale(key)

  • key {String}

根據(jù) language 獲取對應的語言文本。

controller.redirect(url, statusCode)

  • url {String} 要跳轉(zhuǎn)的 url
  • statusCode {Number} 狀態(tài)碼,默認為 302

頁面跳轉(zhuǎn)。

controller.assign(name, value)

  • name {String | Object} 變量名
  • value {Mixed} 變量值

將變量賦值到模版中。

export default class extends think.controller.base {
  indexAction(){
    //單個賦值
    this.assign("title", "thinkjs");
    //批量賦值
    this.assign({
      name: "xxx",
      desc: "yyy"
    })
  }
}

controller.fetch(templateFile)

  • templateFile {String} 模版文件地址
  • return {Promise}

獲取解析后的模版內(nèi)容。

直接獲取
// 假設文件路徑為 /foo/bar/app/home/controller/index.js
export default class extends think.controller.base {
  * indexAction(){
    // home/index_index.html
    let content = yield this.fetch();
  }
}
改變 action
// 假設文件路徑為 /foo/bar/app/home/controller/index.js
export default class extends think.controller.base {
  * indexAction(){
    // home/index_detail.html
    let content = yield this.fetch("detail");
  }
}
改變 controller 和 action
// 假設文件路徑為 /foo/bar/app/home/controller/index.js
export default class extends think.controller.base {
  * indexAction(){
    // home/user_detail.html
    let content = yield this.fetch("user/detail");
  }
}
改變 module, controller 和 action
// 假設文件路徑為 /foo/bar/app/home/controller/index.js
export default class extends think.controller.base {
  * indexAction(){
    // admin/user_detail.html
    let content = yield this.fetch("admin/user/detail");
  }
}
改變文件后綴名
// 假設文件路徑為 /foo/bar/app/home/controller/index.js
export default class extends think.controller.base {
  * indexAction(){
    // home/index_detail.xml
    let content = yield this.fetch("detail.xml");
  }
}
獲取絕對路徑文件
// 假設文件路徑為 /foo/bar/app/home/controller/index.js
export default class extends think.controller.base {
  * indexAction(){
    // /home/xxx/aaa/bbb/c.html
    let content = yield this.fetch("/home/xxx/aaa/bbb/c.html");
  }
}

controller.display(templateFile)

  • templateFile {String} 模版文件路徑

輸出模版內(nèi)容到瀏覽器端。查找模版文件策略和controller.fetch相同。

controller.jsonp(data)

  • data {Mixed} 要輸出的內(nèi)容

jsonp 的方法輸出內(nèi)容,獲取 callback 名稱安全過濾后輸出。

export default class extends think.controller.base {
  indexAction(){
    this.jsonp({name: "thinkjs"});
    //writes
    "callback_fn_name({name: "thinkjs"})"
  }
}

controller.json(data)

  • data {Mixed} 要輸出的內(nèi)容

json 的方式輸出內(nèi)容。

controller.status(status)

  • status {Number} 狀態(tài)碼,默認為 404

設置狀態(tài)碼。

controller.deny(status)

  • status {String} 狀態(tài)碼,默認為 403

拒絕當前請求。

controller.write(data, encoding)

  • data {mixed} 要輸出的內(nèi)容
  • encoding {String} 編碼

輸出內(nèi)容

controller.end(data, encoding)

  • data {mixed} 要輸出的內(nèi)容
  • encoding {String} 編碼

輸出內(nèi)容后結(jié)束當前請求。

controller.type(type, charset)

  • type {String} Content-Type
  • charset {Boolean} 是否自動追加 charset

設置 Content-Type。

controller.download(filePath, contentType, fileName)

  • filePath {String} 下載文件的具體路徑
  • content-Type {String} Content-Type
  • fileName {String} 報錯的文件名

下載文件。

export default class extends think.controller.base {
  indexAction(){
    let filePath = think.RESOUCE_PATH + "/a.txt";
    //自動識別 Content-Type,保存的文件名為 a.txt
    this.download(filePath);
  }
}
export default class extends think.controller.base {
  indexAction(){
    let filePath = think.RESOUCE_PATH + "/a.log";
    //自動識別 Content-Type,保存的文件名為 b.txt
    this.download(filePath, "b.txt");
  }
}
export default class extends think.controller.base {
  indexAction(){
    let filePath = think.RESOUCE_PATH + "/a.log";
    //指定 Content-Type 為 text/html,保存的文件名為 b.txt
    this.download(filePath, "text/html", "b.txt");
  }
}

controller.success(data, message)

  • data {Mixed} 要輸出的數(shù)據(jù)
  • message {String} 追加的message

格式化輸出一個正常的數(shù)據(jù),一般是操作成功后輸出。

http.success({name: "thinkjs"});
//writes
{
  errno: 0,
  errmsg: "",
  data: {
    name: "thinkjs"
  }
}

這樣客戶端就可以根據(jù)errno是否為0為判斷當前請求是否正常。

controller.fail(errno, errmsg, data)

  • errno {Number} 錯誤號
  • errmsg {String} 錯誤信息
  • data {Mixed} 額外的數(shù)據(jù)

格式化輸出一個異常的數(shù)據(jù),一般是操作失敗后輸出。

:字段名errnoerrmsg可以在配置里進行修改。

http.fail(100, "fail")
//writes
{
  errno: 100,
  errmsg: "fail",
  data: ""
}

這樣客戶端就可以拿到具體的錯誤號和錯誤信息,然后根據(jù)需要顯示了。

:字段名errnoerrmsg可以在配置里進行修改。

controller.sendTime(name)

  • name {String} header key

發(fā)送請求的執(zhí)行時間,使用 header 的方式發(fā)出。

文檔地址:https://github.com/75team/www.thinkjs.org/tree/master/view/zh-CN/doc/2.0/api_controller.md

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號