controller

think.controller.base 继承自 think.http.base 类。项目里的控制器需要继承该类。

使用 ES6 的语法继承该类
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. }
  4. }
使用普通方式继承该类
  1. module.exports = think.controller({
  2. indexAction(){
  3. }
  4. })

属性

controller.http

传递进来的 http 对象。

方法

controller.ip()

  • return {String}
    获取当前请求用户的 ip,等同与 http.ip 方法。
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. let ip = this.ip();
  4. }
  5. }

controller.method()

  • return {String}
    获取当前请求的类型,转化为小写。
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. let method = this.method(); //get or post ...
  4. }
  5. }

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,那么请求类型也要相同。
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. //是ajax 且请求类型是 POST
  4. let isAjax = this.isAjax('post');
  5. }
  6. }

controller.isWebSocket()

  • return {Boolean}
    是否是 websocket 请求。

controller.isCli()

  • return {Boolean}
    是否是命令行下调用。

controller.isJsonp(callback)

  • callback {String} callback 名称
  • return {Boolean}
    是否是 jsonp 请求。

controller.get(name)

  • name {String} 参数名
    获取 GET 参数值。
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. //获取一个参数值
  4. let value = this.get('xxx');
  5. //获取所有的参数值
  6. let values = this.get();
  7. }
  8. }

controller.post(name)

  • name {String} 参数名
    获取 POST 提交的参数。
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. //获取一个参数值
  4. let value = this.post('xxx');
  5. //获取所有的 POST 参数值
  6. let values = this.post();
  7. }
  8. }

controller.param(name)

  • name {String} 参数名
    获取参数值,优先从 POST 里获取,如果取不到再从 GET 里获取。

controller.file(name)

  • name {String} 上传文件对应的字段名
    获取上传的文件,返回值是个对象,包含下面的属性:
  1. {
  2. fieldName: 'file', //表单字段名称
  3. originalFilename: filename, //原始的文件名
  4. path: filepath, //文件保存的临时路径,使用时需要将其移动到项目里的目录,否则请求结束时会被删除
  5. size: 1000 //文件大小
  6. }

如果文件不存在,那么值为一个空对象 {}

controller.header(name, value)

  • name {String} header 名
  • value {String} header 值
    获取或者设置 header。
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. let accept = this.header('accept'); //获取 header
  4. this.header('X-NAME', 'thinks'); //设置 header
  5. }
  6. }

controller.expires(time)

  • time {Number} 过期时间,单位为秒
    强缓存,设置 Cache-ControlExpires 头信息。
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. this.expires(86400); //设置过期时间为 1 天。
  4. }
  5. }

controller.userAgent()

获取 userAgent。

controller.referrer(onlyHost)

  • referrer {Boolean} 是否只需要 host
    获取 referrer。
  • name {String} cookie 名
  • value {String} cookie 值
  • options {Object}
    获取、设置或者删除 cookie。
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. //获取 cookie 值
  4. let value = this.cookie('think_name');
  5. }
  6. }
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. //设置 cookie 值
  4. this.cookie('think_name', value, {
  5. timeout: 3600 * 24 * 7 //有效期为一周
  6. });
  7. }
  8. }
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. //删除 cookie
  4. this.cookie('think_name', null);
  5. }
  6. }

controller.session(name, value)

  • name {String} session 名
  • value {Mixed} session 值
  • return {Promise}
    读取、设置和清除 session。
读取 Session
  1. export default class extends think.controller.base {
  2. async indexAction(){
  3. //获取session
  4. let value = await this.session('userInfo');
  5. }
  6. }
设置 Session
  1. export default class extends think.controller.base {
  2. async indexAction(){
  3. //设置 session
  4. await this.session('userInfo', data);
  5. }
  6. }
清除 Session
  1. export default class extends think.controller.base {
  2. async indexAction(){
  3. //清除当前用户的 session
  4. await this.session();
  5. }
  6. }

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} 变量值
    将变量赋值到模版中。
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. //单个赋值
  4. this.assign('title', 'thinkjs');
  5. //批量赋值
  6. this.assign({
  7. name: 'xxx',
  8. desc: 'yyy'
  9. })
  10. }
  11. }

controller.fetch(templateFile)

  • templateFile {String} 模版文件地址
  • return {Promise}
    获取解析后的模版内容。
直接获取
  1. // 假设文件路径为 /foo/bar/app/home/controller/index.js
  2. export default class extends think.controller.base {
  3. async indexAction(){
  4. // home/index_index.html
  5. let content = await this.fetch();
  6. }
  7. }
改变 action
  1. // 假设文件路径为 /foo/bar/app/home/controller/index.js
  2. export default class extends think.controller.base {
  3. async indexAction(){
  4. // home/index_detail.html
  5. let content = await this.fetch('detail');
  6. }
  7. }
改变 controller 和 action
  1. // 假设文件路径为 /foo/bar/app/home/controller/index.js
  2. export default class extends think.controller.base {
  3. async indexAction(){
  4. // home/user_detail.html
  5. let content = await this.fetch('user/detail');
  6. }
  7. }
改变 module, controller 和 action
  1. // 假设文件路径为 /foo/bar/app/home/controller/index.js
  2. export default class extends think.controller.base {
  3. async indexAction(){
  4. // admin/user_detail.html
  5. let content = await this.fetch('admin/user/detail');
  6. }
  7. }
改变文件后缀名
  1. // 假设文件路径为 /foo/bar/app/home/controller/index.js
  2. export default class extends think.controller.base {
  3. async indexAction(){
  4. // home/index_detail.xml
  5. let content = await this.fetch('detail.xml');
  6. }
  7. }
获取绝对路径文件
  1. // 假设文件路径为 /foo/bar/app/home/controller/index.js
  2. export default class extends think.controller.base {
  3. async indexAction(){
  4. // /home/xxx/aaa/bbb/c.html
  5. let content = await this.fetch('/home/xxx/aaa/bbb/c.html');
  6. }
  7. }

controller.display(templateFile)

  • templateFile {String} 模版文件路径
    输出模版内容到浏览器端。查找模版文件策略和 controller.fetch 相同。

controller.jsonp(data)

  • data {Mixed} 要输出的内容
    jsonp 的方法输出内容,获取 callback 名称安全过滤后输出。
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. this.jsonp({name: 'thinkjs'});
  4. //writes
  5. 'callback_fn_name({name: "thinkjs"})'
  6. }
  7. }

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} 保存的文件名
    下载文件。
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. let filePath = think.RESOUCE_PATH + '/a.txt';
  4. //自动识别 Content-Type,保存的文件名为 a.txt
  5. this.download(filePath);
  6. }
  7. }
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. let filePath = think.RESOUCE_PATH + '/a.log';
  4. //自动识别 Content-Type,保存的文件名为 b.txt
  5. this.download(filePath, 'b.txt');
  6. }
  7. }
  1. export default class extends think.controller.base {
  2. indexAction(){
  3. let filePath = think.RESOUCE_PATH + '/a.log';
  4. //指定 Content-Type 为 text/html,保存的文件名为 b.txt
  5. this.download(filePath, 'text/html', 'b.txt');
  6. }
  7. }

controller.success(data, message)

  • data {Mixed} 要输出的数据
  • message {String} 追加的message
    格式化输出一个正常的数据,一般是操作成功后输出。
  1. http.success({name: 'thinkjs'});
  2. //writes
  3. {
  4. errno: 0,
  5. errmsg: '',
  6. data: {
  7. name: 'thinkjs'
  8. }
  9. }

这样客户端就可以根据 errno 是否为 0 为判断当前请求是否正常。

controller.fail(errno, errmsg, data)

  • errno {Number} 错误号
  • errmsg {String} 错误信息
  • data {Mixed} 额外的数据
    格式化输出一个异常的数据,一般是操作失败后输出。

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

  1. http.fail(100, 'fail')
  2. //writes
  3. {
  4. errno: 100,
  5. errmsg: 'fail',
  6. data: ''
  7. }

这样客户端就可以拿到具体的错误号和错误信息,然后根据需要显示了。

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

controller.sendTime(name)

  • name {String} header key
    发送请求的执行时间,使用 header 的方式发出。

原文: https://thinkjs.org/zh-cn/doc/2.0/api_controller.html