- Controller
- ip()
- isGet()
- isPost()
- isMethod(method)
- isAjax(method)
- isWebSocket()
- get(name)
- post(name)
- param(name)
- file(name)
- header(name, value)
- userAgent()
- referer()
- cookie(name, value, options)
- session(name, value)
- redirect(url, code)
- assign(name, value)
- fetch(templateFile)
- display(templateFile)
- action(action, data)
- jsonp(data)
- json(data)
- status(status)
- echo(data, encoding)
- end(data, encoding)
- type(ext)
- download(file, contentType, filename)
- success(data)
- error(errno, errmsg, data)
- filter(value, type)
- valid(data, type)
Controller
此文档表示控制器下接口,在子控制器下可以直接使用。
如果想在 Controller 里的 Action 查看 http 相关功能,可以查看 这里。
ip()
获取当前请求的用户 ip。
testAction: function(){
// 用户 ip
var ip = this.ip();
}
如果项目部署在本地的话,返回的 ip 为 127.0.0.1
。
isGet()
判断当前请求是否是 get 请求。
testAction: function(){
// 如果是 get 请求直接渲染模版
if(this.isGet()){
return this.display();
}
}
isPost()
判断当前请求是否是 post 请求。
testAction: function(){
// 如果是 post 请求获取对应的数据
if(this.isPost()){
var data = this.post();
}
}
isMethod(method)
判断是否是一个特定类型的请求。
testAction: function(){
// 判断是否是 put 请求
var isPut = this.isMethod("put");
// 判断是否是 delete 请求
var isDel = this.isMethod("delete");
}
http 支持的请求类型为:GET
, POST
, PUT
, DELETE
, HEAD
, OPTIONS
, PATCH
。
isAjax(method)
判断是否是 ajax 类型的请求。
testAction: function(){
// 只判断是否是 ajax 请求
var isAjax = this.isAjax();
// 判断是否是 get 类型的 ajax 请求
var isGetAjax = this.isAjax("get");
// 判断是否是 post 类型的 ajax 请求
var isPostAjax = this.isAjax("post");
}
isWebSocket()
判断是否是 websocket 请求。
testAction: function(){
// 是否是 WebSocket 请求
var isWS = this.isWebSocket();
}
get(name)
获取 get 参数值,默认值为空字符串。
testAction: function(){
// 获取 name 值
var name = this.get("name");
}
如果不传 name
,则为获取所有的参数值。
testAction: function(){
// 获取所有的参数值
// 如:{name: "welefen", "email": "welefen@gmail.com"}
var data = this.get();
}
post(name)
获取 post 过来的值,默认值为空字符串。
testAction: function(){
// 获取 post 值
var name = this.post("name");
}
如果不传 name
,则为获取所有的 post 值。
testAction: function(){
// 获取所有的 post 值
// 如:{name: "welefen", "email": "welefen@gmail.com"}
var data = this.post();
}
param(name)
获取 get 或者 post 参数,优先从 post 里获取。等同于下面的方式:
testAction: function(){
// 这 2 种方式的结果是一样的
var name = this.param("name");
var name = this.post("name") || this.get("name");
}
file(name)
获取上传的文件。
testAction: function(){
// 获取表单名为 image 上传的文件
var file = this.file("image");
}
如果不传 name
,那么获取所有上传的文件。
具体的文件格式见: http://www.ThinkJS.org/doc/http.html# 上传的文件
header(name, value)
获取或者发送 header 信息。
获取头信息
获取单个头信息
// 获取单个头信息
testAction: function(){
var value = this.header("accept");
}
获取所有的头信息
// 获取所有的头信息
testAction: function(){
var headers = this.header();
}
设置头信息
设置单个头信息
// 设置单个头信息
testAction: function(){
this.header("Content-Type", "text/xml");
}
批量设置头信息
testAction: function(){
this.header({
"Content-Type": "text/html",
"X-Power": "test"
})
}
userAgent()
获取浏览器端传递过来的 userAgent。
// 获取 userAgent
testAction: function(){
var userAgent = this.userAgent();
}
referer()
获取 referer。
// 获取 referrer
testAction: function(){
var referrer = this.referer();
}
cookie(name, value, options)
获取或者设置 cookie
获取 cookie
获取单个 cookie
// 获取单个 cookie
testAction: function(){
var name = this.cookie("name");
}
获取所有 cookie
// 获取所有 cookie
testAction: function(){
var cookies = this.cookie();
}
设置 cookie
设置 cookie 默认会用如下的配置,可以在 App/Conf/config.js
里修改。
// 设置 cookie 默认配置
cookie_domain: "", //cookie 有效域名
cookie_path: "/", //cookie 路径
cookie_timeout: 0, //cookie 失效时间,0 为浏览器关闭,单位:秒
// 设置 cookie
testAction: fucntion(){
this.cookie("name", "welefen");
// 修改发送 cookie 的选项
this.cookie("value", "xxx", {
domain: "",
path: "/",
httponly: true, //httponly
secure: true, //https 下才发送 cookie 到服务端
timeout: 1000 // 超时时间,单位秒
})
}
session(name, value)
获取或者设置 session。
获取 session
// 获取 session
testAction: function(){
// 获取 session 是个异步的过程,返回一个 promise
this.session("userInfo").then(function(data){
if(isEmpty(data)){
// 无用户数据
}
})
}
设置 session
testAction: function(){
// 设置 session 也是异步操作
this.session("userInfo", {name: "welefen"}).then(function(){
})
}
删除 session
testAction: function(){
// 不传任何参数表示删除 session,比如:用户退出的时候执行删除的操作
this.session().then(function(){
})
}
redirect(url, code)
url 跳转。
code
默认值为 302return
返回一个 pendding promise,阻止后面代码继续执行
testAction: function(){
var self = this;
return this.session("userInfo").then(function(data){
if(isEmpty(data)){
// 如果用户未登录,则跳转到登录页面
return self.redirect("/login");
}
})
}
assign(name, value)
给模版变量赋值,或者读取已经赋值的模版变量。
变量赋值
单个变量赋值
testAction: function(){
// 单个变量赋值
this.assign("name", "value");
}
批量赋值
testAction: function(){
this.assign({
name: "welefen",
url: "http://www.ThinkJS.org/"
})
}
读取赋值变量
testAction: function(){
// 读取已经赋值的变量
var value = this.assign("url");
}
fetch(templateFile)
获取渲染后的模版文件内容。
templateFile
需要渲染的模版文件路径return
返回一个 promise
模版文件路径寻找规则如下:
- 如果不传 templateFile,那么自动根据当前的 Group、Controller、Action 拼接模版文件路径
- 如果 templateFile 是个相对路径,那么自动追加
VIEW_PATH
- 如果 templateFile 是
groupaction
,那么会进行解析再拼接成对应的模版文件路径 - 如果 templateFile 是个绝对路径,那么直接调用
testAction: function(){
this.assign('name', 'xxx');
// 自动分析模版文件路径
this.fetch().then(function(content){
//content 为渲染后的内容
});
// 路径前面追加 VIEW_PATH
this.fetch('home/test_a.html');
// 绝对路径,直接调用
this.fetch('/home/xxx/www/www.domain.com/ttt.html');
// 调用其他分组下的模版文件
this.fetch('home:group:detail');
// 调用当前分组下其他的模版文件
this.fetch('group:detail');
}
display(templateFile)
输出渲染后的模版文件内容到浏览器。
templateFile
需要渲染的模版文件路径return
返回一个 promise
templateFile
查找规则与 fetch 方法的 templateFile
查找规则相同。
action(action, data)
可以跨分组、跨控制器的 action 调用。
return
返回一个 promise
testAction: function(){
// 调用相同分组下的控制器为 group,操作为 detail 方法
var promise = this.action("group:detail", [10]);
// 调用 admin 分组下的控制器为 group,操作为 list 方法
var promise = this.action("admin:group:list", [10])
}
jsonp(data)
jsonp 数据输出。
会自动发送 Content-Type
,默认值为 application/json
,可以在配置 json_content_type
中修改。
jsonp 的 callback 名称默认从参数名为 callback
中获取,可以在配置 url_callback_name
中修改。
callback 名称会自动做安全过滤,只保留 \w\.
字符。
testAction: function(){
this.jsonp({name: "xxx"});
}
假如当前请求为 /test?callback=functioname
,那么输出为 functioname({name: "xxx"})
。
注
: 如果没有传递 callback 参数,那么以 json 格式输出。
json(data)
json 数据输出。
会自动发送 Content-Type
,默认值为 application/json
,可以在配置 json_content_type
中修改。
status(status)
发送状态码,默认为 404。
// 发送 http 状态码
testAction: function(){
this.status(403);
}
echo(data, encoding)
输出数据,可以指定编码。
默认自动发送 Content-Type
,值为 text/html
。可以在配置 tpl_content_type
中修改,也可以设置 auto_send_content_type = false
来关闭发送 Content-Type
。
data
如果是数组或者对象,自动调用 JSON.stringify。如果不是字符串或者 Buffer,那么自动转化为字符串。
testAction: function(){
this.echo({name: "welefen"});
}
end(data, encoding)
结束当前的 http 请求数据输出。
如果是通过 this.echo
输出数据,那么在最后必须要调用 this.end
来结束输出。
data
如果 data 不为空,那么自动调用this.echo
来输出数据
testAction: function(){
this.end({name: "welefen"});
}
type(ext)
发送 Content-Type
。
ext
如果是文件扩展名,那么自动查找该扩展名对应的Mime-Type
。
testAction: function(){
this.type("text/html");
this.type("js"); // 自动查找 js 对应的 Mime-Type
this.type("css"); // 自动查找 css 对应的 Mime-Type
}
download(file, contentType, filename)
下载文件。
file
要下载的文件路径contentType
要发送的Content-Type
, 如果没传,自动从文件扩展名里获取filename
下载的文件名return
返回一个 promise
testAction: function(){
var file = "/home/welefen/a.txt";
this.download(file, 'text/html', '1.txt').then(function(){
// 下载完成后可以在这里进行一些操作,如:将下载次数 +1
});
}
success(data)
输出一个错误号为 0 的数据。
return
返回一个 pendding promise,阻止后面继续执行。
testAction: function(){
return this.success({email: "xxx@gmail.com"})
}
浏览器拿到的数据为:
{
errno: 0,
errmsg: "",
data: {email: "xxx@gmail.com"}
}
其中 errno
表示错误号(此时为 0),errmsg
表示错误信息(此时为空)。data
里存放具体数据。
会自动发送 Content-Type
,默认值为 application/json
,可以在配置 json_content_type
中修改。
其中 errno
和 errmsg
可以通过下面的配置修改:
error_no_key: "errno", // 错误号的 key
error_msg_key: "errmsg", // 错误信息的 key
error(errno, errmsg, data)
输出一个 errno > 0 的信息。
errno
错误号,默认为 1000,可以通过配置error_no_default_value
修改errmsg
错误信息,字符串data
额外的数据return
返回一个 pedding promise,阻止后续继续执行
// 输出一个错误信息
testAction: function(){
return this.error(1001, "参数不合法");
}
浏览器拿到的数据为:
{
errno: 1001,
errmsg: "参数不合法"
}
也可以值输出错误信息,那么错误号为配置 error_no_default_value
的值。
testAction: function(){
return this.error("参数不合法");
}
浏览器拿到的数据为:
{
errno: 1000,
errmsg: "参数不合法"
}
也可以传个对象进去,如:
testAction: function(){
return this.error({
errno: 10001,
errmsg: "参数不合法"
})
}
filter(value, type)
变量过滤器,具体请见 这里。
valid(data, type)
数据校验,具体请见 这里。