controller

controller 是ThinkKoa中的控制器基类。所有的控制器都必须继承 controller或它的子类

  1. const {controller} = require('thinkkoa');
  2. module.exports = class extends controller {
  3. //构造方法init代替constructor
  4. init(ctx, app) {
  5. }
  6. }

控制器属性和方法

ctx

ctx对象。

  1. this.ctx

app

thinkkoa的实例, 是koa实例的扩展

  1. this.app

__empty()

空方法。执行当前控制器不存在的方法,自动调用。

  1. //src/controller/index.js控制器
  2. ...
  3. __empty(){
  4. return this.write('action not found');
  5. }
  6. indexAction(){
  7. return this.write('hello world');
  8. }
  9. ...
  10. //当访问 /index/index页面输出 'hello world'
  11. //当访问 /index/aaa 页面输出 'action not found'

isGet()

判断当前request是否GET请求。

  1. if (this.isGet()) {
  2. //当前请求为GET请求
  3. }

isPost()

判断当前request是否POST请求。

  1. if (this.isPost()) {
  2. //当前请求为POST请求
  3. }

isMethod(method)

  • method 请求类型 get/post等

判断当前请求是否是传入的特定请求。

  1. if (this.isMethod('get')) {
  2. //当前请求为GET请求
  3. }

isAjax()

判断当前request是否Ajax请求。

  1. if (this.isAjax()) {
  2. //当前请求为Ajax请求
  3. }

isPjax()

判断当前request是否Pjax请求。

  1. if (this.isPjax()) {
  2. //当前请求为Pjax请求
  3. }

isJsonp(name)

  • name jsonP callback 函数名

判断当前request是否Jsonp请求。

  1. if (this.isJsonp('callback')) {
  2. //当前请求为Jsonp请求
  3. }

header(name, value)

获取或设置header内容。

  • name 键
  • value 值
  1. this.header('Content-Type', 'text/plian'); //等同于 ctx.set('Content-Type', 'text/plian')
  2. this.header('Content-Type'); //等同于 ctx.get('Content-Type')

get([name, value])

  • name 参数名,如果值为undefined则返回所有querystring参数
  • value 参数值

获取或构造querystring参数。

  1. //获取参数
  2. let test = this.get('test') || '';
  3. //构造参数
  4. this.get('test', {aa: 1});

post([name, value])

  • name 参数名,如果值为undefined则返回所有post参数
  • value 参数值

获取或构造post参数。

  1. //获取参数
  2. let test = this.post('test') || '';
  3. //构造参数
  4. this.post('test', {aa: 1});

param([name])

  • name 参数名,如果值为undefined则返回所有querystring以及post参数
  1. querystring中同名key会被post值覆盖

获取参数,先从post参数中查找,如果不存在则从querstring中查找。

  1. let all = this.param();
  2. let info = this.param('info') || {};

file([name, value])

  • name 文件名,如果值为undefined则返回所有file对象
  • value 参数值

获取或构造上传的file对象。

  1. //获取参数
  2. let test = this.file('filename') || {};
  3. //构造参数
  4. this.file('test.txt', {...});

types(contentType[, encoding])

  • contentType 文档类型
  • encoding 编码格式,默认值为'utf-8'content-type 操作。
  1. this.types('text/plian', 'utf-8');

referer([host])

  • host url,如果传入值,返回 hostname

获取request referrer。

  1. let ref = this.referer();
  2. ref = this.referer('http://baidu.com');

redirect(urls[, alt])

  • urls 需要跳转的url
  • alt 定义Referrer

页面跳转。

  1. this.redirect('/index');
  2. this.redirect('http://baidu.com');

deny([code = 403])

返回403禁止访问。

  1. return this.deny();

依赖think_cookie中间件

获取或者设置cookie值。options包括项

  • signed sign cookie 值
  • domain: '', // cookie所在的域名
  • path: '/', // cookie所在的路径
  • maxAge: 86400, // cookie有效时长
  • httpOnly: true, // 是否只用于http请求中获取
  • overwrite: false, // 是否允许重写
  • expires: new Date('2017-02-15') // cookie失效时间
  1. //获取cookie
  2. this.cookie('site');
  3. //设置cookie
  4. this.cookie('site', 'www.baidu.com');

如果options未传递,默认遵循中间件的配置。可在项目中间件配置文件中进行定义:

  1. /**
  2. * Middleware config
  3. * @return
  4. */
  5. module.exports = {
  6. list: [], //加载的中间件列表
  7. config: { //中间件配置
  8. cookie: {
  9. domain: '',
  10. path: '/',
  11. ...
  12. }
  13. }
  14. };

session(name[, value, timeout])

依赖think_session中间件

获取或设置session。

  1. //获取session
  2. this.session('user');
  3. //写入session
  4. this.session('user', {'username': 'test'});
  5. //写入session,30s过期
  6. this.session('user', {'username': 'test'}, 30);

cache(name[, value, timeout])

依赖think_cache中间件

获取或设置缓存。

  1. //在控制器中获取缓存
  2. this.cache('user');
  3. //在中间件或服务类中获取缓存需要使用控制器的this.app对象
  4. app.cache('user');
  5. //写入缓存
  6. this.cache('user', {'username': 'test'});
  7. //写入缓存,30s过期
  8. this.cache('user', {'username': 'test'}, 30);

config([name, type = 'config'])

读取配置项。

  • name 配置项 key
  • type 配置类型,默认为项目配置。分为 config,middleware …
  1. //在控制器中获取配置
  2. this.config('aa');
  3. //在中间件或服务类中获取配置需要使用控制器的this.app对象
  4. app.config('aa');
  5. //获取项目配置 config/config.js
  6. this.config('aa.bb'); // aa: {bb: 1}
  7. //获取中间件配置 config/middleware.js
  8. this.config('config.cache', 'middleware');

write(data[, contentType, encoding])

对ctx.body赋值进行功能封装。 注意控制器中的this.write方法和ctx.write最大的不同是输出内容后,会返回think.prevent()错误中断程序执行。

  • content 输出的内容
  • contentType 输出文档类型,默认 text/plain
  • encoding 输出文档编码,默认 utf-8,在项目配置文件 src/config/config.js内可修改
  1. return this.write('content', 'text/plain'); //页面输出 content

json(data)

  • data 输出的数据

response返回json格式数据。常用于API接口。

  1. return this.json({aa: 111, bb: 222}); //页面输出 {"aa": 111, "bb":222}

jsonp(data)

  • data 输出的数据

response返回jsonp格式数据。用于回调前端函数。在jsonp返回值之前,request请求的时候需要传递callback函数名作为参数(http://host/index?callback=fun_name)

  1. //http://host/index?callback=fun_name
  2. return this.jsonp({dddddd: 1}); //页面输出 fun_name({"dddddd": 1})

success(errmsg[, data, code = 200, options = {}])

  • errmsg 输出的信息
  • data 输出的数据
  • code 错误码
  • options 选项

在控制器逻辑执行成功时,response返回统一格式化json数据。常用于API接口。

  1. return this.success('操作成功'); //页面输出 {"status":1,"errno":200,"errmsg":"操作成功","data":{}}

ok(errmsg[, data, code = 200, options = {}])

功能同success.

error(errmsg[, data, code = 500, options = {}])

  • errmsg 输出的信息
  • data 输出的数据
  • code 错误码
  • options 选项

在控制器逻辑执行失败时,response返回统一格式化json数据。常用于API接口。

  1. return this.error('操作失败'); //页面输出 {"status":0,"errno":500,"errmsg":"操作失败","data":{}}

fail(errmsg[, data, code = 500, options = {}])

功能同error.

assign(name, value)

依赖think_view中间件

  • name 模板赋值key
  • value 模板赋值value

在使用模板引擎渲染模板时候,向模板赋值,模板赋值数据对象保存在 this.tVar

  1. this.assign('user', '张三');
  2. //获取所有模板赋值变量
  3. this.assign(); //返回 {"user": "张三"}

set(name, value)

依赖think_view中间件

功能同assign.

compile(templateFile, data)

依赖think_view中间件

  • templateFile 模板路径
  1. 传递文件物理路径,可以直接定位渲染模板
  2. 传递空值,框架自动根据 /模板路径配置/模块/控制器 查找模板
  3. 传递 /模块名/控制器名 也可以定位模板
  • data 模板赋值数据对象

调用模板引擎,渲染模板返回渲染后的内容.

  1. let content = await this.compile('', {aa: 1});

render(templateFile, charset, contentType)

依赖think_view中间件

  • templateFile 模板路径
  1. 传递文件物理路径,可以直接定位渲染模板
  2. 传递空值,框架自动根据 /模板路径配置/模块/控制器 查找模板
  3. 传递 /模块名/控制器名 也可以定位模板
  • charset 输出字符集
  • contentType 输出文档类型

渲染模板并输出内容,依赖中间件think_view

  1. return this.render();

display(templateFile, charset, contentType)

依赖think_view中间件

功能与render相同。