這里的 http 對(duì)象并不是 Node.js 里的 http 模塊,而是對(duì) request 和 response 對(duì)象包裝后一個(gè)新的對(duì)象。
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 創(chuàng)建服務(wù)時(shí),會(huì)傳遞 request 和 response 2個(gè)對(duì)象給回調(diào)函數(shù)。為了后續(xù)調(diào)用方便, ThinkJS 對(duì)這2個(gè)對(duì)象進(jìn)行了包裝,包裝成了 http 對(duì)象,并且提供很多有用的方法。
http 對(duì)象會(huì)在 middleware, logic, controller, view 中傳遞。
注
:http 對(duì)象是 EventEmitter 的一個(gè)實(shí)例,所以可以對(duì)其進(jìn)行事件監(jiān)聽(tīng)和執(zhí)行。
系統(tǒng)原生的 request 對(duì)象
系統(tǒng)原生的 response 對(duì)象
請(qǐng)求的開(kāi)始時(shí)間,是個(gè)unix
時(shí)間戳。
當(dāng)前請(qǐng)求的 url 。
當(dāng)前請(qǐng)求的 http 版本。
當(dāng)前請(qǐng)求的類(lèi)型。
當(dāng)前請(qǐng)求的所有頭信息。
當(dāng)前請(qǐng)求的 pathname,路由識(shí)別會(huì)依賴(lài)該值,會(huì)在后續(xù)的處理中對(duì)其進(jìn)行改變。所以在 action 拿到值可能跟初始解析出來(lái)的值不一致。
當(dāng)前請(qǐng)求的所有 query 數(shù)據(jù)。
當(dāng)前請(qǐng)求的 host, 包含端口。
當(dāng)前請(qǐng)求的 hostname,不包含端口。
當(dāng)前請(qǐng)求的 payload 數(shù)據(jù),提交型的請(qǐng)求才含有該值。
表示當(dāng)前請(qǐng)求的 payload 數(shù)據(jù)是否已經(jīng)解析。
存放 GET 參數(shù)值。
存放 POST 參數(shù)值
存放上傳的文件數(shù)據(jù)
存放 cookie 數(shù)據(jù)。
name
{String} 參數(shù)名return
{Mixed} 返回對(duì)應(yīng)的參數(shù)值獲取當(dāng)前請(qǐng)求下對(duì)應(yīng)的參數(shù)值。
return
{String} 請(qǐng)求的 referrer返回當(dāng)前請(qǐng)求的 referrer。
return
{String} 請(qǐng)求的 userAgent返回當(dāng)前請(qǐng)求的 userAgent。
return
{Boolean}返回當(dāng)前請(qǐng)求是否是 GET 請(qǐng)求。
return
{Boolean}返回當(dāng)前請(qǐng)求是否是 POST 請(qǐng)求。
method
{String} 請(qǐng)求類(lèi)型return
{Boolean}返回當(dāng)前請(qǐng)求是否是 Ajax 請(qǐng)求。
http.isAjax(); //判斷是否是Ajax請(qǐng)求
http.isAjax("GET"); //判斷是否是Ajax請(qǐng)求,且請(qǐng)求類(lèi)型是GET
name
{String} callback 參數(shù)名稱(chēng),默認(rèn)為 callbackreturn
{Boolean}返回當(dāng)前請(qǐng)求是否是 jsonp 請(qǐng)求。
//url is /index/test?callback=testxxx
http.isJsonp(); //true
http.isJsonp("cb"); //false
name
{String} 參數(shù)名稱(chēng)value
{Mixed} 參數(shù)值獲取或者設(shè)置 GET 參數(shù)值。可以通過(guò)該方法設(shè)置 GET 參數(shù)值,方便后續(xù)的邏輯里獲取。
// url is /index/test?name=thinkjs
http.get("name"); // returns "thinkjs"
http.get("name", "other value");
http.get("name"); // returns "other value"
name
{String} 參數(shù)名稱(chēng)value
{Mixed} 參數(shù)值獲取或者設(shè)置 POST 值。可以通過(guò)該方法設(shè)置 POST 值,方便后續(xù)的邏輯里獲取。
http.post("email"); //獲取提交的email
name
{String} 參數(shù)名稱(chēng)return
{Mixed}獲取參數(shù)值,優(yōu)先從 POST 里獲取,如果值為空,則從 URL 參數(shù)里獲取。
name
{String} 文件對(duì)應(yīng)的字段名稱(chēng)return
{Object}獲取上傳的文件。
http.file("image");
//returns
{
fieldName: "image", //表單里的字段名
originalFilename: filename, //原始文件名
path: filepath, //文件臨時(shí)存放的路徑
size: size //文件大小
}
name
{String} header 名稱(chēng)value
{String} header 值獲取或者設(shè)置 header 信息。
http.header("accept"); //獲取accept
http.header("X-NAME", "thinkjs"); //設(shè)置header
time
{Number} 過(guò)期時(shí)間,單位為秒強(qiáng)緩存,設(shè)置 Cache-Control
和 Expires
頭信息。
http.header(86400); //設(shè)置過(guò)期時(shí)間為 1 天。
設(shè)置狀態(tài)碼。如果頭信息已經(jīng)發(fā)送,則無(wú)法設(shè)置狀態(tài)碼。
http.status(400); //設(shè)置狀態(tài)碼為400
獲取用戶(hù)的 ip 。如果使用了代理,獲取的值可能不準(zhǔn)。
lang
{String} 要設(shè)置的語(yǔ)言asViewPath
{Boolean} 是否添加一層模版語(yǔ)言目錄獲取或者設(shè)置國(guó)際化的語(yǔ)言,可以支持模版路徑要多一層語(yǔ)言的目錄。
let lang = http.lang();
獲取語(yǔ)言的循序?yàn)?nbsp;http._lang
-> 從 cookie 中獲取
-> 從 header 中獲取
,如果需要從 url 中解析語(yǔ)言,可以獲取后通過(guò) http.lang(lang)
方法設(shè)置到屬性 http._lang
中。
let lang = getFromUrl();
http.lang(lang, true); //設(shè)置語(yǔ)言,并指定模版路徑中添加一層語(yǔ)言目錄
獲取或者設(shè)置主題,設(shè)置后模版路徑要多一層主題的目錄。
name
{String} cookie 名稱(chēng)value
{String} cookie 值讀取或者設(shè)置 cookie 值。
http.cookie("think_test"); //獲取名為 think_test 的 cookie
http.cookie("name", "value"); //設(shè)置 cookie,如果頭信息已經(jīng)發(fā)送則設(shè)置無(wú)效
name
{String} session 名value
{Mixed} session 值return
{Promise}讀取、設(shè)置和清除 session。
let value = yield http.session("userInfo");
yield http.session("userInfo", data);
yield http.session();
url
{String} 要跳轉(zhuǎn)的 urlstatus
{Number} 狀態(tài)碼, 301 或者 302,默認(rèn)為302頁(yè)面跳轉(zhuǎn)。
http.redirect("/login"); //跳轉(zhuǎn)到登錄頁(yè)面
contentType
{String} 要設(shè)置的 contentTypeencoding
{String} 要設(shè)置的編碼獲取或者設(shè)置 Content-Type。
http.type(); //獲取Content-Type
http.type("text/html"); //設(shè)置Content-Type,會(huì)自動(dòng)加上charset
http.type("audio/mpeg", false); //設(shè)置Content-Type,不追加charset
content
{Mixed} 要輸出的內(nèi)容encoding
{String} 編碼輸出內(nèi)容,要調(diào)用 http.end 才能結(jié)束當(dāng)前請(qǐng)求。
content
{Mixed} 要輸出的內(nèi)容encoding
{String} 編碼輸出內(nèi)容并結(jié)束當(dāng)前請(qǐng)求。
data
{Mixed} 要輸出的數(shù)據(jù)message
{String} 追加的message格式化輸出一個(gè)正常的數(shù)據(jù),一般是操作成功后輸出。
http.success({name: "thinkjs"});
//writes
{
errno: 0,
errmsg: "",
data: {
name: "thinkjs"
}
}
這樣客戶(hù)端就可以根據(jù)errno
是否為0
為判斷當(dāng)前請(qǐng)求是否正常。
errno
{Number} 錯(cuò)誤號(hào)errmsg
{String} 錯(cuò)誤信息data
{Mixed} 額外的數(shù)據(jù)格式化輸出一個(gè)異常的數(shù)據(jù),一般是操作失敗后輸出。
注
:字段名errno
和errmsg
可以在配置里進(jìn)行修改。
http.fail(100, "fail")
//writes
{
errno: 100,
errmsg: "fail",
data: ""
}
這樣客戶(hù)端就可以拿到具體的錯(cuò)誤號(hào)和錯(cuò)誤信息,然后根據(jù)需要顯示了。
注
:字段名errno
和errmsg
可以在配置里進(jìn)行修改。
data
{Object}json 方式輸出數(shù)據(jù),會(huì)設(shè)置 Content-Type 為 application/json
,該值對(duì)應(yīng)的配置為json_content_type
。
文檔地址:https://github.com/75team/www.thinkjs.org/tree/master/view/zh-CN/doc/2.0/api_http.md
更多建議: