这里的 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 数据,提交型的请求才含有该值。
注
:该属性后续会废弃,建议使用 http.getPayload
方法。
存放 GET 参数值。
存放 POST 参数值
存放上传的文件数据
存放 cookie 数据。
当前请求解析后对应的模块名。
当前请求解析后对应的控制器名。
当前请求解析后对应的操作名。
return
{Promise} payload 内容获取 payload。
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
。