这里的 http 对象并不是 Node.js 里的 http 模块,而是对 request 和 response 对象包装后一个新的对象。
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8124);
如上面的代码所示,Node.js 创建服务时,会传递 request 和 response 2个对象给回调函数。为了后续调用方便, ThinkJS 对这2个对象进行了包装,包装成了 http 对象,并且提供很多有用的方法。
http 对象会在 middleware, logic, controller, view 中传递。
注
:http 对象是 EventEmitter 的一个实例,所以可以对其进行事件监听和执行。
系统原生的 request 对象
系统原生的 response 对象
请求的开始时间,是个unix
时间戳。
当前请求的 url 。
当前请求的 http 版本。
当前请求的类型。
当前请求的所有头信息。
当前请求的 pathname,路由识别会依赖该值,会在后续的处理中对其进行改变。所以在 action 拿到值可能跟初始解析出来的值不一致。
当前请求的所有 query 数据。
当前请求的 host, 包含端口。
当前请求的 hostname,不包含端口。
当前请求的 payload 数据,提交型的请求才含有该值。
表示当前请求的 payload 数据是否已经解析。
存放 GET 参数值。
存放 POST 参数值
存放上传的文件数据
存放 cookie 数据。
当前请求解析后对应的模块名。
当前请求解析后对应的控制器名。
当前请求解析后对应的操作名。
name
{String} 参数名return
{Mixed} 返回对应的参数值获取当前请求下对应的参数值。
return
{String} 请求的 referrer返回当前请求的 referrer。
return
{String} 请求的 userAgent返回当前请求的 userAgent。
return
{Boolean}返回当前请求是否是 GET 请求。
return
{Boolean}返回当前请求是否是 POST 请求。
method
{String} 请求类型return
{Boolean}返回当前请求是否是 Ajax 请求。
http.isAjax(); //判断是否是Ajax请求
http.isAjax('GET'); //判断是否是Ajax请求,且请求类型是GET
name
{String} callback 参数名称,默认为 callbackreturn
{Boolean}返回当前请求是否是 jsonp 请求。
//url is /index/test?callback=testxxx
http.isJsonp(); //true
http.isJsonp('cb'); //false
name
{String} 参数名称value
{Mixed} 参数值获取或者设置 GET 参数值。可以通过该方法设置 GET 参数值,方便后续的逻辑里获取。
// url is /index/test?name=thinkjs
http.get('name'); // returns 'thinkjs'
http.get('name', 'other value');
http.get('name'); // returns 'other value'
name
{String} 参数名称value
{Mixed} 参数值获取或者设置 POST 值。可以通过该方法设置 POST 值,方便后续的逻辑里获取。
http.post('email'); //获取提交的email
name
{String} 参数名称return
{Mixed}获取参数值,优先从 POST 里获取,如果值为空,则从 URL 参数里获取。
name
{String} 文件对应的字段名称return
{Object} 获取上传的文件。
http.file('image');
//returns
{
fieldName: 'image', //表单里的字段名
originalFilename: filename, //原始文件名
path: filepath, //文件临时存放的路径
size: size //文件大小
}
name
{String} header 名称value
{String} header 值获取或者设置 header 信息。
http.header('accept'); //获取accept
http.header('X-NAME', 'thinkjs'); //设置header
time
{Number} 过期时间,单位为秒强缓存,设置 Cache-Control
和 Expires
头信息。
http.header(86400); //设置过期时间为 1 天。
设置状态码。如果头信息已经发送,则无法设置状态码。
http.status(400); //设置状态码为400
获取用户的 ip 。如果使用了代理,获取的值可能不准。
lang
{String} 要设置的语言asViewPath
{Boolean} 是否添加一层模版语言目录获取或者设置国际化的语言,可以支持模版路径要多一层语言的目录。
let lang = http.lang();
获取语言的循序为 http._lang
-> 从 cookie 中获取
-> 从 header 中获取
,如果需要从 url 中解析语言,可以获取后通过 http.lang(lang)
方法设置到属性 http._lang
中。
let lang = getFromUrl();
http.lang(lang, true); //设置语言,并指定模版路径中添加一层语言目录
获取或者设置主题,设置后模版路径要多一层主题的目录。
name
{String} cookie 名称value
{String} cookie 值读取或者设置 cookie 值。
http.cookie('think_test'); //获取名为 think_test 的 cookie
http.cookie('name', 'value'); //设置 cookie,如果头信息已经发送则设置无效
http.cookie('name', null); //删除 cookie
name
{String} session 名value
{Mixed} session 值return
{Promise}读取、设置和清除 session。
let value = await http.session('userInfo');
await http.session('userInfo', data);
await http.session();
url
{String} 要跳转的 urlstatus
{Number} 状态码, 301 或者 302,默认为302页面跳转。
http.redirect('/login'); //跳转到登录页面
contentType
{String} 要设置的 contentTypeencoding
{String} 要设置的编码获取或者设置 Content-Type。
http.type(); //获取Content-Type
http.type('text/html'); //设置Content-Type,会自动加上charset
http.type('audio/mpeg', false); //设置Content-Type,不追加charset
content
{Mixed} 要输出的内容encoding
{String} 编码输出内容,要调用 http.end 才能结束当前请求。
content
{Mixed} 要输出的内容encoding
{String} 编码输出内容并结束当前请求。
data
{Mixed} 要输出的数据message
{String} 追加的message格式化输出一个正常的数据,一般是操作成功后输出。
http.success({name: 'thinkjs'});
//writes
{
errno: 0,
errmsg: '',
data: {
name: 'thinkjs'
}
}
这样客户端就可以根据 errno
是否为 0
为判断当前请求是否正常。
errno
{Number} 错误号errmsg
{String} 错误信息data
{Mixed} 额外的数据格式化输出一个异常的数据,一般是操作失败后输出。
注
:字段名 errno
和 errmsg
可以在配置里进行修改。
http.fail(100, 'fail')
//writes
{
errno: 100,
errmsg: 'fail',
data: ''
}
这样客户端就可以拿到具体的错误号和错误信息,然后根据需要显示了。
注
:字段名 errno
和 errmsg
可以在配置里进行修改。
data
{Object}json 方式输出数据,会设置 Content-Type 为 application/json
,该值对应的配置为json_content_type
。