controller

最后更新于:2022-04-01 04:35:01

[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)
';