[TOC=2,4]
`think.controller.base`?繼承自?[think.http.base](https://thinkjs.org/zh-CN/doc/2.0/api_think_http_base.html)?類。項目里的控制器需要繼承該類。
##### 使用 ES6 的語法繼承該類
~~~
export default class extends think.controller.base {
indexAction(){
}
}
~~~
##### 使用普通方式繼承該類
~~~
module.exports = think.controller({
indexAction(){
}
})
~~~
### 屬性
#### controller.http
傳遞進來的?[http](https://thinkjs.org/zh-CN/doc/2.0/api_http.html)?對象。
### 方法
#### controller.ip()
* `return`?{String}
獲取當前請求用戶的 ip,等同與 http.ip 方法。
~~~
export default class extends think.controller.base {
indexAction(){
let ip = this.ip();
}
}
~~~
#### controller.method()
* `return`?{String}
獲取當前請求的類型,轉化為小寫。
~~~
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}
是否是命令行下調用。
#### controller.isJsonp(callback)
* `callback`?{String} callback 名稱
* `return`?{Boolean}
是否是 jsonp 請求。
#### controller.get(name)
* `name`?{String} 參數名
獲取 GET 參數值。
~~~
export default class extends think.controller.base {
indexAction(){
//獲取一個參數值
let value = this.get("xxx");
//獲取所有的參數值
let values = this.get();
}
}
~~~
#### controller.post(name)
* `name`?{String} 參數名
獲取 POST 提交的參數。
~~~
export default class extends think.controller.base {
indexAction(){
//獲取一個參數值
let value = this.post("xxx");
//獲取所有的 POST 參數值
let values = this.post();
}
}
~~~
#### controller.param(name)
* `name`?{String} 參數名
獲取參數值,優先從 POST 里獲取,如果取不到再從 GET 里獲取。
#### controller.file(name)
* `name`?{String} 上傳文件對應的字段名
獲取上傳的文件,返回值是個對象,包含下面的屬性:
~~~
{
fieldName: "file", //表單字段名稱
originalFilename: filename, //原始的文件名
path: filepath, //文件保存的臨時路徑,使用時需要將其移動到項目里的目錄,否則請求結束時會被刪除
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}
根據 language 獲取對應的語言文本。
#### controller.redirect(url, statusCode)
* `url`?{String} 要跳轉的 url
* `statusCode`?{Number} 狀態碼,默認為 302
頁面跳轉。
#### 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}
獲取解析后的模版內容。
##### 直接獲取
~~~
// 假設文件路徑為 /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} 模版文件路徑
輸出模版內容到瀏覽器端。查找模版文件策略和`controller.fetch`相同。
#### controller.jsonp(data)
* `data`?{Mixed} 要輸出的內容
jsonp 的方法輸出內容,獲取 callback 名稱安全過濾后輸出。
~~~
export default class extends think.controller.base {
indexAction(){
this.jsonp({name: "thinkjs"});
//writes
"callback_fn_name({name: "thinkjs"})"
}
}
~~~
#### controller.json(data)
* `data`?{Mixed} 要輸出的內容
json 的方式輸出內容。
#### controller.status(status)
* `status`?{Number} 狀態碼,默認為 404
設置狀態碼。
#### controller.deny(status)
* `status`?{String} 狀態碼,默認為 403
拒絕當前請求。
#### controller.write(data, encoding)
* `data`?{mixed} 要輸出的內容
* `encoding`?{String} 編碼
輸出內容
#### controller.end(data, encoding)
* `data`?{mixed} 要輸出的內容
* `encoding`?{String} 編碼
輸出內容后結束當前請求。
#### 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} 要輸出的數據
* `message`?{String} 追加的message
格式化輸出一個正常的數據,一般是操作成功后輸出。
~~~
http.success({name: "thinkjs"});
//writes
{
errno: 0,
errmsg: "",
data: {
name: "thinkjs"
}
}
~~~
這樣客戶端就可以根據`errno`是否為`0`為判斷當前請求是否正常。
#### controller.fail(errno, errmsg, data)
* `errno`?{Number} 錯誤號
* `errmsg`?{String} 錯誤信息
* `data`?{Mixed} 額外的數據
格式化輸出一個異常的數據,一般是操作失敗后輸出。
`注`:字段名`errno`和`errmsg`可以在配置里進行修改。
~~~
http.fail(100, "fail")
//writes
{
errno: 100,
errmsg: "fail",
data: ""
}
~~~
這樣客戶端就可以拿到具體的錯誤號和錯誤信息,然后根據需要顯示了。
`注`:字段名`errno`和`errmsg`可以在配置里進行修改。
#### controller.sendTime(name)
* `name`?{String} header key
發送請求的執行時間,使用 header 的方式發出。
文檔地址:[https://github.com/75team/www.thinkjs.org/tree/master/view/zh-CN/doc/2.0/api_controller.md](https://github.com/75team/www.thinkjs.org/tree/master/view/zh-CN/doc/2.0/api_controller.md)
- 快速入門
- 介紹
- 創建項目
- 項目結構
- 代碼規范
- 升級指南
- 進階應用
- 模塊
- 控制器
- 視圖
- 配置
- 路由
- 模型
- 介紹
- 事務
- 關聯模型
- Mysql
- MongoDB
- SQLite
- Adapter
- 介紹
- Cache
- Session
- WebSocket
- Template
- 擴展功能
- thinkjs 命令
- 靜態資源訪問
- Middleware
- Service
- Cookie
- 錯誤處理
- 錯誤信息
- 數據校驗
- 國際化
- 路徑常量
- REST API
- 定時任務
- 線上部署
- 推薦模塊
- API
- think
- think.base
- think.http.base
- http
- controller
- rest controller
- model
- model.mongo
- middleware