Controller

此文档表示控制器下接口,在子控制器下可以直接使用。

如果想在 Controller 里的 Action 查看 http 相关功能,可以查看 这里

ip()

获取当前请求的用户 ip。

  1. testAction: function(){
  2. // 用户 ip
  3. var ip = this.ip();
  4. }

如果项目部署在本地的话,返回的 ip 为 127.0.0.1

isGet()

判断当前请求是否是 get 请求。

  1. testAction: function(){
  2. // 如果是 get 请求直接渲染模版
  3. if(this.isGet()){
  4. return this.display();
  5. }
  6. }

isPost()

判断当前请求是否是 post 请求。

  1. testAction: function(){
  2. // 如果是 post 请求获取对应的数据
  3. if(this.isPost()){
  4. var data = this.post();
  5. }
  6. }

isMethod(method)

判断是否是一个特定类型的请求。

  1. testAction: function(){
  2. // 判断是否是 put 请求
  3. var isPut = this.isMethod("put");
  4. // 判断是否是 delete 请求
  5. var isDel = this.isMethod("delete");
  6. }

http 支持的请求类型为:GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH

isAjax(method)

判断是否是 ajax 类型的请求。

  1. testAction: function(){
  2. // 只判断是否是 ajax 请求
  3. var isAjax = this.isAjax();
  4. // 判断是否是 get 类型的 ajax 请求
  5. var isGetAjax = this.isAjax("get");
  6. // 判断是否是 post 类型的 ajax 请求
  7. var isPostAjax = this.isAjax("post");
  8. }

isWebSocket()

判断是否是 websocket 请求。

  1. testAction: function(){
  2. // 是否是 WebSocket 请求
  3. var isWS = this.isWebSocket();
  4. }

get(name)

获取 get 参数值,默认值为空字符串。

  1. testAction: function(){
  2. // 获取 name 值
  3. var name = this.get("name");
  4. }

如果不传 name,则为获取所有的参数值。

  1. testAction: function(){
  2. // 获取所有的参数值
  3. // 如:{name: "welefen", "email": "welefen@gmail.com"}
  4. var data = this.get();
  5. }

post(name)

获取 post 过来的值,默认值为空字符串。

  1. testAction: function(){
  2. // 获取 post 值
  3. var name = this.post("name");
  4. }

如果不传 name,则为获取所有的 post 值。

  1. testAction: function(){
  2. // 获取所有的 post 值
  3. // 如:{name: "welefen", "email": "welefen@gmail.com"}
  4. var data = this.post();
  5. }

param(name)

获取 get 或者 post 参数,优先从 post 里获取。等同于下面的方式:

  1. testAction: function(){
  2. // 这 2 种方式的结果是一样的
  3. var name = this.param("name");
  4. var name = this.post("name") || this.get("name");
  5. }

file(name)

获取上传的文件。

  1. testAction: function(){
  2. // 获取表单名为 image 上传的文件
  3. var file = this.file("image");
  4. }

如果不传 name,那么获取所有上传的文件。

具体的文件格式见: http://www.ThinkJS.org/doc/http.html# 上传的文件

header(name, value)

获取或者发送 header 信息。

获取头信息

获取单个头信息

  1. // 获取单个头信息
  2. testAction: function(){
  3. var value = this.header("accept");
  4. }

获取所有的头信息

  1. // 获取所有的头信息
  2. testAction: function(){
  3. var headers = this.header();
  4. }

设置头信息

设置单个头信息

  1. // 设置单个头信息
  2. testAction: function(){
  3. this.header("Content-Type", "text/xml");
  4. }

批量设置头信息

  1. testAction: function(){
  2. this.header({
  3. "Content-Type": "text/html",
  4. "X-Power": "test"
  5. })
  6. }

userAgent()

获取浏览器端传递过来的 userAgent。

  1. // 获取 userAgent
  2. testAction: function(){
  3. var userAgent = this.userAgent();
  4. }

referer()

获取 referer。

  1. // 获取 referrer
  2. testAction: function(){
  3. var referrer = this.referer();
  4. }

获取或者设置 cookie

获取单个 cookie

  1. // 获取单个 cookie
  2. testAction: function(){
  3. var name = this.cookie("name");
  4. }

获取所有 cookie

  1. // 获取所有 cookie
  2. testAction: function(){
  3. var cookies = this.cookie();
  4. }

设置 cookie 默认会用如下的配置,可以在 App/Conf/config.js 里修改。

  1. // 设置 cookie 默认配置
  2. cookie_domain: "", //cookie 有效域名
  3. cookie_path: "/", //cookie 路径
  4. cookie_timeout: 0, //cookie 失效时间,0 为浏览器关闭,单位:秒
  1. // 设置 cookie
  2. testAction: fucntion(){
  3. this.cookie("name", "welefen");
  4. // 修改发送 cookie 的选项
  5. this.cookie("value", "xxx", {
  6. domain: "",
  7. path: "/",
  8. httponly: true, //httponly
  9. secure: true, //https 下才发送 cookie 到服务端
  10. timeout: 1000 // 超时时间,单位秒
  11. })
  12. }

session(name, value)

获取或者设置 session。

获取 session

  1. // 获取 session
  2. testAction: function(){
  3. // 获取 session 是个异步的过程,返回一个 promise
  4. this.session("userInfo").then(function(data){
  5. if(isEmpty(data)){
  6. // 无用户数据
  7. }
  8. })
  9. }

设置 session

  1. testAction: function(){
  2. // 设置 session 也是异步操作
  3. this.session("userInfo", {name: "welefen"}).then(function(){
  4. })
  5. }

删除 session

  1. testAction: function(){
  2. // 不传任何参数表示删除 session,比如:用户退出的时候执行删除的操作
  3. this.session().then(function(){
  4. })
  5. }

redirect(url, code)

url 跳转。

  • code 默认值为 302
  • return 返回一个 pendding promise,阻止后面代码继续执行
  1. testAction: function(){
  2. var self = this;
  3. return this.session("userInfo").then(function(data){
  4. if(isEmpty(data)){
  5. // 如果用户未登录,则跳转到登录页面
  6. return self.redirect("/login");
  7. }
  8. })
  9. }

assign(name, value)

给模版变量赋值,或者读取已经赋值的模版变量。

变量赋值

单个变量赋值

  1. testAction: function(){
  2. // 单个变量赋值
  3. this.assign("name", "value");
  4. }

批量赋值

  1. testAction: function(){
  2. this.assign({
  3. name: "welefen",
  4. url: "http://www.ThinkJS.org/"
  5. })
  6. }

读取赋值变量

  1. testAction: function(){
  2. // 读取已经赋值的变量
  3. var value = this.assign("url");
  4. }

fetch(templateFile)

获取渲染后的模版文件内容。

  • templateFile 需要渲染的模版文件路径
  • return 返回一个 promise

模版文件路径寻找规则如下:

  • 如果不传 templateFile,那么自动根据当前的 Group、Controller、Action 拼接模版文件路径
  • 如果 templateFile 是个相对路径,那么自动追加 VIEW_PATH
  • 如果 templateFile 是 group:controller:action,那么会进行解析再拼接成对应的模版文件路径
  • 如果 templateFile 是个绝对路径,那么直接调用
  1. testAction: function(){
  2. this.assign('name', 'xxx');
  3. // 自动分析模版文件路径
  4. this.fetch().then(function(content){
  5. //content 为渲染后的内容
  6. });
  7. // 路径前面追加 VIEW_PATH
  8. this.fetch('home/test_a.html');
  9. // 绝对路径,直接调用
  10. this.fetch('/home/xxx/www/www.domain.com/ttt.html');
  11. // 调用其他分组下的模版文件
  12. this.fetch('home:group:detail');
  13. // 调用当前分组下其他的模版文件
  14. this.fetch('group:detail');
  15. }

display(templateFile)

输出渲染后的模版文件内容到浏览器。

  • templateFile 需要渲染的模版文件路径
  • return 返回一个 promise

templateFile 查找规则与 fetch 方法的 templateFile 查找规则相同。

action(action, data)

可以跨分组、跨控制器的 action 调用。

  • return 返回一个 promise
  1. testAction: function(){
  2. // 调用相同分组下的控制器为 group,操作为 detail 方法
  3. var promise = this.action("group:detail", [10]);
  4. // 调用 admin 分组下的控制器为 group,操作为 list 方法
  5. var promise = this.action("admin:group:list", [10])
  6. }

jsonp(data)

jsonp 数据输出。

会自动发送 Content-Type,默认值为 application/json,可以在配置 json_content_type 中修改。

jsonp 的 callback 名称默认从参数名为 callback 中获取,可以在配置 url_callback_name 中修改。

callback 名称会自动做安全过滤,只保留 \w\. 字符。

  1. testAction: function(){
  2. this.jsonp({name: "xxx"});
  3. }

假如当前请求为 /test?callback=functioname,那么输出为 functioname({name: "xxx"})

: 如果没有传递 callback 参数,那么以 json 格式输出。

json(data)

json 数据输出。

会自动发送 Content-Type,默认值为 application/json,可以在配置 json_content_type 中修改。

status(status)

发送状态码,默认为 404。

  1. // 发送 http 状态码
  2. testAction: function(){
  3. this.status(403);
  4. }

echo(data, encoding)

输出数据,可以指定编码。

默认自动发送 Content-Type,值为 text/html。可以在配置 tpl_content_type 中修改,也可以设置 auto_send_content_type = false 来关闭发送 Content-Type

  • data 如果是数组或者对象,自动调用 JSON.stringify。如果不是字符串或者 Buffer,那么自动转化为字符串。
  1. testAction: function(){
  2. this.echo({name: "welefen"});
  3. }

end(data, encoding)

结束当前的 http 请求数据输出。

如果是通过 this.echo 输出数据,那么在最后必须要调用 this.end 来结束输出。

  • data 如果 data 不为空,那么自动调用 this.echo 来输出数据
  1. testAction: function(){
  2. this.end({name: "welefen"});
  3. }

type(ext)

发送 Content-Type

  • ext 如果是文件扩展名,那么自动查找该扩展名对应的 Mime-Type
  1. testAction: function(){
  2. this.type("text/html");
  3. this.type("js"); // 自动查找 js 对应的 Mime-Type
  4. this.type("css"); // 自动查找 css 对应的 Mime-Type
  5. }

download(file, contentType, filename)

下载文件。

  • file 要下载的文件路径
  • contentType 要发送的 Content-Type, 如果没传,自动从文件扩展名里获取
  • filename 下载的文件名
  • return 返回一个 promise
  1. testAction: function(){
  2. var file = "/home/welefen/a.txt";
  3. this.download(file, 'text/html', '1.txt').then(function(){
  4. // 下载完成后可以在这里进行一些操作,如:将下载次数 +1
  5. });
  6. }

success(data)

输出一个错误号为 0 的数据。

  • return 返回一个 pendding promise,阻止后面继续执行。
  1. testAction: function(){
  2. return this.success({email: "xxx@gmail.com"})
  3. }

浏览器拿到的数据为:

  1. {
  2. errno: 0,
  3. errmsg: "",
  4. data: {email: "xxx@gmail.com"}
  5. }

其中 errno 表示错误号(此时为 0),errmsg 表示错误信息(此时为空)。data 里存放具体数据。

会自动发送 Content-Type,默认值为 application/json,可以在配置 json_content_type 中修改。

其中 errnoerrmsg 可以通过下面的配置修改:

  1. error_no_key: "errno", // 错误号的 key
  2. error_msg_key: "errmsg", // 错误信息的 key

error(errno, errmsg, data)

输出一个 errno > 0 的信息。

  • errno 错误号,默认为 1000,可以通过配置 error_no_default_value 修改
  • errmsg 错误信息,字符串
  • data 额外的数据
  • return 返回一个 pedding promise,阻止后续继续执行
  1. // 输出一个错误信息
  2. testAction: function(){
  3. return this.error(1001, "参数不合法");
  4. }

浏览器拿到的数据为:

  1. {
  2. errno: 1001,
  3. errmsg: "参数不合法"
  4. }

也可以值输出错误信息,那么错误号为配置 error_no_default_value 的值。

  1. testAction: function(){
  2. return this.error("参数不合法");
  3. }

浏览器拿到的数据为:

  1. {
  2. errno: 1000,
  3. errmsg: "参数不合法"
  4. }

也可以传个对象进去,如:

  1. testAction: function(){
  2. return this.error({
  3. errno: 10001,
  4. errmsg: "参数不合法"
  5. })
  6. }

filter(value, type)

变量过滤器,具体请见 这里

valid(data, type)

数据校验,具体请见 这里