国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Koa2開(kāi)發(fā)詳解(自官網(wǎng))

ZHAO_ / 1639人閱讀

摘要:通過(guò)杠桿生成器可以讓你引導(dǎo)回調(diào)函數(shù),極大的提升錯(cuò)誤處理。這是因?yàn)樵群茈y讓用戶有好的使用的回調(diào)函數(shù)。返回一個(gè)回調(diào)函數(shù),相當(dāng)于方法,來(lái)出了請(qǐng)求。使的有效期到期。檢查請(qǐng)求緩存是否刷新,或者內(nèi)容是否發(fā)生改變。

Koa

次世代nodejs 的 web框架

簡(jiǎn)介

koa是由Express幕后團(tuán)隊(duì)打造的,目的是更小,更快,更穩(wěn)定的web應(yīng)用和apis。通過(guò)杠桿生成器(leveraging generators)Koa可以讓你引導(dǎo)(ditch)回調(diào)函數(shù),極大的提升錯(cuò)誤處理。Koa核心不集成任何的中間件,其本身提供的優(yōu)雅的功能套件就能夠?qū)懗黾瓤煊謓ice的服務(wù)器。

安裝

Koa需要node7.6.0或更高的版本,因?yàn)樾枰?b>async function支持。
你可以使用自己的版本管理器很快的安裝一個(gè)支持的版本。

nvm install 7
npm i koa
node my-koa-app.js
Async Function 結(jié)合 Babel

想要在較低版本的node中使用async函數(shù),我們建議使用babel。

require("babel-core/register")
//然后在加載應(yīng)用的主代碼,這個(gè)必須在babel后面
const app = require("./app")

為了編譯和轉(zhuǎn)化async functions你需要在最后的壓縮版本中使用"transform-async-to-generator"或者transform-async-to-module-method插件。例如,在你的.babelrc文件中,進(jìn)行如下設(shè)置。

{
    "plugins":["transform-async-to-generator"]
}

你也可以使用stage-3 persent來(lái)代替。

應(yīng)用 Application

一個(gè)Koa應(yīng)用是一個(gè)對(duì)象,其包含一個(gè)數(shù)組,數(shù)組有很多函數(shù)組成的中間件,這些函數(shù)集合起來(lái)等待請(qǐng)求,并且執(zhí)行時(shí)是按照類棧的方式。koa和很多其他中間件系統(tǒng)相似,你也許是用過(guò)RubyRack,Connect等。然而一個(gè)設(shè)計(jì)的決定行因素是提供高等級(jí)"sugar",與此同時(shí)低等級(jí)中間件層。因此提升了交互性,魯棒性(軟件設(shè)計(jì)術(shù)語(yǔ),即穩(wěn)定性)并且使得編寫中間件更加的帶勁!

這包括一些常用任務(wù)的方法——例如鏈接協(xié)調(diào),緩存,代理支持,別用等。盡管提供了大量的有用的方法,但是koa仍然保持了一個(gè)較小的體積,因?yàn)闆](méi)有綁定中間件。

怎么能偶少得了一個(gè)hello world應(yīng)用。

const Koa = require("koa");
const app = new Koa();

app.use(ctx => {
    ctx.body = "hello world";
})

app.listen(3000)
串聯(lián) Cascading

koa 的串聯(lián)中間件使用了一個(gè)比較傳統(tǒng)的方式,跟你通常用的工具很像。這是因?yàn)樵群茈y讓用戶有好的使用node的回調(diào)函數(shù)。然而使用異步函數(shù)我們能偶“真正得”是有中間件。相較于連接的實(shí)現(xiàn),這個(gè)更容易提供一些列函數(shù)/功能來(lái)控制,在最后返回便可。koa調(diào)用"downstream",控制流返回"upstream".

下面的例子返回“hello world”,然而最開(kāi)始請(qǐng)求先通過(guò)x-response-timelogging中間件來(lái)記錄請(qǐng)求的開(kāi)始。然后通過(guò)返回的中間件產(chǎn)出控制。當(dāng)一個(gè)中間件執(zhí)行next()函數(shù),來(lái)延遲和傳遞控制給下一個(gè)聲明的中間件。然后直到?jīng)]有中間件需要執(zhí)行downstream了,棧將會(huì)松開(kāi)然后每個(gè)中間件復(fù)原去展現(xiàn)自己的“upstream”行為。

設(shè)置 Settings

應(yīng)用設(shè)置即在實(shí)例app上的屬性。當(dāng)前支持如下:

app.env 默認(rèn)是NODE_ENV或者“development”。

app.proxy 當(dāng)設(shè)置為true時(shí),porxy頭部將被信任。

app.subdomainOffset 設(shè)置.subdomains的偏移量。替代[2]。

app.listen(...)
一個(gè)Koa應(yīng)用不是一對(duì)一的呈現(xiàn)一個(gè)htpp服務(wù)器。一個(gè)或者多個(gè)應(yīng)用也許被添加到一塊形成大的應(yīng)用對(duì)應(yīng)一個(gè)http服務(wù)器。

創(chuàng)建返回一個(gè)http服務(wù)器,傳遞給定的參數(shù)到Server#listen()。這些參數(shù)在nodejs.org都有說(shuō)明。下面是一個(gè)無(wú)意義的Koa應(yīng)用,綁定了端口3000

app.listen(...)方法是如下的一個(gè)語(yǔ)法糖。

const http = require("http")
const Koa = require("koa")
const app = new Koa()
http.createServer(app.callback()).listen(3000)
這說(shuō)明你可以定義同一個(gè)應(yīng)用為https和http或者多個(gè)地址。
const http = require("http");
const Koa = require("koa");
const app = new Koa();
http.createServer(app.callback()).listen(3000);
http.createServer(app.callback()).listen(3001);

app.callback()
返回一個(gè)回調(diào)函數(shù),相當(dāng)于http.createServer()方法,來(lái)出了請(qǐng)求。

你也可以使用這個(gè)方法在你的Connect/Express應(yīng)用中添加koa應(yīng)用。

app.use(function)

添加一個(gè)給定的中間件方法來(lái)實(shí)現(xiàn)它的功能。查看Middleware了解更多。

app.keys=
設(shè)置cookie的鍵。

這些鍵被傳遞到KeyGrip,也許你想使用自己的KeyGrip,可以如下做。

app.keys = ["im a newer secret", "i like turtle"];
app.keys = new KeyGrip(["im a newer secret", "i like turtle"], "sha256");

這些鍵也許是循環(huán)的,并且可以設(shè)置{signed:true}來(lái)使用。

ctx.cookies.set("name","tobi",{signed:true})

app.context
app.context是ctx的來(lái)源。你可以使用app.context添加額外的屬性到ctx。這對(duì)于創(chuàng)建跨越整個(gè)app應(yīng)用的屬性或者方法來(lái)說(shuō)是有用的,而且性能更好,在依賴上也跟簡(jiǎn)單,可以考慮做一個(gè)anti-pattern

例子,從ctx添加一個(gè)數(shù)據(jù)庫(kù)引用。

add.context.db = db()

app.use(async (ctx)=>{
    console.log(ctx.db)
})

注意:

通過(guò)getter和setter以及Object.difineProperty()設(shè)置的屬性,你只能在app.context使用Object.defineProperty()來(lái)編輯他們。(不推薦)

使用父級(jí)的ctx和設(shè)置來(lái)添加當(dāng)前的應(yīng)用。這樣添加的app就能使用到那些中間件。

錯(cuò)誤處理 Error Handling

除非設(shè)置app.silent是true,不然所有的出無(wú)輸出都是標(biāo)準(zhǔn)輸出。默認(rèn)的錯(cuò)誤輸出不會(huì)處理像是err.sttus是404或者err.expose是true。為了自定義錯(cuò)誤輸出例如日志,你可以添加錯(cuò)誤事件監(jiān)聽(tīng)。

app.on("error", err =>
  log.error("server error", err)
);

當(dāng) req/res 周期中出現(xiàn)任何錯(cuò)誤且無(wú)法響應(yīng)客戶端時(shí),Koa 會(huì)把 Context(上下文) 實(shí)例作為第二個(gè)參數(shù)傳遞給 error 事件:

app.on("error", (err, ctx) =>
  log.error("server error", err, ctx)
);

如果有錯(cuò)誤發(fā)生, 并且還能響應(yīng)客戶端(即沒(méi)有數(shù)據(jù)被寫入到 socket), Koa 會(huì)返回 500 "Internal Server Error". 這兩種情況都會(huì)觸發(fā) app-level 的 error 事件, 用于 logging.

環(huán)境(Context)

一個(gè)Koa環(huán)境(實(shí)例)封裝了node原生的請(qǐng)求和返回對(duì)象到一個(gè)多帶帶的對(duì)象中,這個(gè)多帶帶的對(duì)象提供了許多使用的方法,能夠編寫web應(yīng)用和API。這些HTTP服務(wù)器開(kāi)發(fā)中經(jīng)常用到的操作被添加到當(dāng)前等級(jí),而不是高等級(jí)。他將強(qiáng)制中間件重新實(shí)現(xiàn)這些常用的功能。

一個(gè)環(huán)境Context在每次請(qǐng)求時(shí)被創(chuàng)建,并且被引用至中間件作為接收器,或者定義成this。如下所示。

app.use(function *(){
    this;//這里是koa環(huán)境context
    this.request;//是一個(gè)koa請(qǐng)求
    this.response;//是一個(gè)koa返回
})

很多context環(huán)境訪問(wèn)器和方法只是ctx.requestkoa請(qǐng)求或者ctx.responsekoa返回的代理,主要是為了方便。例如ctx.typectx.length代表response返回對(duì)象,ctx.pahtctx.methos代表請(qǐng)求。

API 接口。
環(huán)境(Context)定義的方法和訪問(wèn)器。

ctx.req Node的request對(duì)象。

ctx.res Node的response對(duì)象。
繞開(kāi)使用koa的response處理是不支持的。避免使用下面的node屬性。

res.statusCode

res.writeHead()

res.write()

res.end()

ctx.request 一個(gè)Koa的request對(duì)象。

ctx.response 一個(gè)Koa的response對(duì)象。

ctx.state
推薦的通過(guò)中間件傳遞信息給前端view(顯示)的命名空間。

ctx.app 應(yīng)用實(shí)例的引用。

ctx.cookies.get(name,[options])
通過(guò)options獲得cookie名字。

signed 要求cookie已經(jīng)簽名。
koa使用cookie模塊,這里只是傳入選項(xiàng)即可。

ctx.coolies.set(name,value,[options])
使用options設(shè)置name的值value

signed 簽名cookie的值。

expires 使cookie的有效期到期。

path cookie路徑,默認(rèn)/

domain cookie域

secure 保護(hù)coolie

httpOnly 服務(wù)器端cookie,默認(rèn)值true
通過(guò)設(shè)置options來(lái)使用cookie模塊。

ctx.throw([msg],[status],[properties])
處理拋出錯(cuò)誤的輔助方法,默認(rèn).status的值為500時(shí)拋出,koa在返回的信息中適當(dāng)處理。限免的組合也是可疑的。

this.throw(403);

this.throw("name require", 400);

this.throw(400,"name require");

this.throw("something exploded");

例如:this.throw("name require", 400)等于

var err = new Error("name require");
err.status = 400;
throw err;

注意這些是用戶自定義的錯(cuò)誤,使用err.expose發(fā)出。因此只適合某些客戶端的反饋。這些錯(cuò)誤不同于內(nèi)置的錯(cuò)誤信息提醒,因?yàn)殄e(cuò)誤的詳細(xì)信息不會(huì)泄露。

你也許傳遞一個(gè)properties選項(xiàng)對(duì)象,他和原來(lái)的錯(cuò)誤信息進(jìn)行了整合,對(duì)于人性化體驗(yàn)很有幫助,它報(bào)告?zhèn)€給請(qǐng)求者一個(gè)回溯流(upsteam)。

this.throw(401,"access_denied",{user:user});
this.throw("access_denied",{user:user});

koa使用http-errors來(lái)創(chuàng)建錯(cuò)誤。

ctx.assert(value,[msg],[status],[properties])

跑出錯(cuò)誤輔助方法,類似`.throw()`,當(dāng)`!value`是類似node的`assert()`方法。

this.assert(this.sate.user,401,"User not found, Please login!");

koa使用http-assert實(shí)現(xiàn)斷言(assertions)

ctx.response
通過(guò)繞開(kāi)koa內(nèi)置的返回處理(response handling),你可以明確的設(shè)置this.response = false;如果你想使用原生的res對(duì)象處理而不是koa的response處理,那么就使用它。

注意那種用法koa不支持。這也許會(huì)打斷koa中間件本來(lái)的功能,或者koa也被打斷。使用這個(gè)屬性最好考慮一下hack,這是使用傳統(tǒng)的fn(req,res)方法和koa中間件的唯一方便的方法。

請(qǐng)求別名Request aliases
下面的訪問(wèn)起和Request別名相等。

ctx.header

ctx.headers

ctx.method

ctx.method=

ctx.url

ctx.url=

ctx.originalUrl

ctx.origin

ctx.href

ctx.path

ctx.query

ctx.query=

ctx.querystring

ctx.querystring=

ctx.host

ctx.hostname

ctx.fresh

ctx.stale

ctx.socket

ctx.protocol

ctx.secure

ctx.ip

ctx.ips

ctx.subdomains

ctx.is()

ctx.accepts()

ctx.acceptsEncodings()

ctx.acceptsCharsets()

ctx.acceptsLanguages()

ctx.get()

返回別名Response aliases
下面的訪問(wèn)起和返回別名相等

ctx.body

ctx.body=

ctx.status

ctx.status=

ctx.message

ctx.message=

ctx.length=

ctx.length

ctx.type

ctx.type=

ctx.handerSent

ctx.redirect()

ctx.attachment()

ctx.set()

ctx.append()

ctx.remove()

ctx.lastModified=

ctx.etag=

請(qǐng)求 Request

一個(gè)koa請(qǐng)求Request對(duì)象是個(gè)建立在node請(qǐng)求request之上的抽象。提供了一些額外的功能,這對(duì)每個(gè)http服務(wù)器開(kāi)發(fā)者來(lái)說(shuō)非常有用。

API

request.header

Request header 對(duì)象

request.headers

Requests header 對(duì)象,別名`request.header`。

request.method

request.method

request.method=

設(shè)置request method,實(shí)現(xiàn)中間件很有用,例如`methodoverride()`。

request.length

返回request Content-lenght值是數(shù)字或者undefined。

request.url

返回rquest URL

request.url=

設(shè)置rquest URL,重寫url時(shí)有用。

request.originalUrl

返回request 原始 URL

request.orgin

得到URL的域,包括協(xié)議和host(主機(jī)號(hào))。

this.request.origin
//=>http://example.com

request.href

返回全部request URL,包括協(xié)議,主機(jī)號(hào),和url。

this.request.href
//=>http://example.com/foo/bar?q=1

request.path

返回路徑名(pathname)。

request.path=

設(shè)置請(qǐng)求路徑名字,保存查詢參數(shù)

rquest.querystring

得到原始的查詢參數(shù),不包含`?`。

request.querystring=

設(shè)置原始的查詢參數(shù)。

request.search

得到原始的查詢字符,帶`?`。

request.search=

設(shè)置原始的查詢字符。

rquest.host

得到主機(jī)號(hào)(hostname:port)當(dāng)呈現(xiàn)時(shí)。支持`X-Forwarded-Host`當(dāng)`app.proxy`是true,否則是常用的`host`。

request.hostname

當(dāng)有時(shí)返回hostname,支持`X-Frowarded-Host`當(dāng)`app.proxy`是true,否則是常用的。

request.type

返回request的`Content-type`,無(wú)效的一些參數(shù),如`charset`。

var ct = this.request.type.
//=>"image/png"

request.charset

當(dāng)有時(shí)返回request的charset,或者`undefined`。

this.request.charset
//=>"utf-8"

request.query

返回解析過(guò)的查詢字符query-string,如果沒(méi)有則返回一個(gè)空對(duì)象。注意,這個(gè)getter不支持嵌套的解析nested parsing。例如:`color=blue&size=small`。

{
    color:"blue",
    size:"small"
}

request.query=
設(shè)置查詢字符query-string到給定的對(duì)象。注意給設(shè)置setter不支持嵌套對(duì)象。

this.query = {next:"/login"};

request.fresh

檢查請(qǐng)求緩存是否“刷新fresh”,或者內(nèi)容是否發(fā)生改變。這個(gè)方法是為了`if-None-Match`和`if-Modified-Since`以及`last-modified`之間的緩存溝通。他必須能夠引用到更改之后的返回頭部response headers

//freshness check requeire stats 20x or 304
this.status = 200;
this.set("ETag","123");

//cache is ok
if(this.fresh) {
    this.status = 304;
    return;
}

//cache is stale
//fetch new data
shis.body = yield db.find("something");

request.stale

與`request.fresh`相反

request.protocol

返回請(qǐng)求協(xié)議,`https`或者`http`。支持`X-Forwarded-Proto`當(dāng)`app.proxy`是true。

request.secure

`this.protocol == "https"`的速記,用以檢查一個(gè)求情能否通過(guò)安全傳輸層。

request.ip

請(qǐng)求的遠(yuǎn)程地址。支持`X-Forwarded-For`當(dāng)`app.proxy`為true。

request.ips

當(dāng)有`X-Forwarded-For`并且`app.proxy`可用,那么返回這些的ip的一個(gè)數(shù)組。
從回溯upstream——>downstream預(yù)定,當(dāng)上述不可用則返回一個(gè)空數(shù)組。

request.subdomains

返回子域數(shù)組。
子域是在主域之前的部分,由點(diǎn)`.`分開(kāi)。默認(rèn)情況下,應(yīng)用的主域都被假設(shè)成倒數(shù)的那兩個(gè)。可以通過(guò)`app.subdomainOffset`來(lái)改變。
例如,如果域是`tobi.ferrest.example.com`,并且`app.subdomainOffset`沒(méi)有設(shè)置,那么這個(gè)子域是["ferrets","tobi"]。如果設(shè)置`app.subdomainOffset`為3,那么子域是["tobi"]。

request.is(type...)

檢查接下來(lái)的請(qǐng)求是否包含`Content-Type`頭部?jī)?nèi)容,它包含任何的mime類型。如果這里沒(méi)有請(qǐng)求體,返回undefined。如果沒(méi)有內(nèi)容類型,或者匹配失敗,返回false。其他的直接返回內(nèi)容類型(mime)。

//Contetn-type:text/html;charset=utf-8
this.is("html");//=>"html"
this.is("text/html");//=>"text/html"
this.is("text/*", "test/html");//=>"test/html"

//when Content-type is application/json
this.is("json","urlencoded");//=>"json"
this.is("application/json",);//=>"application/json"
this.is("html","application/*",);//=>"application/json"

this.is("html");//=>false

例子:你只想只有圖片能夠發(fā)送到路由

if(this.is("image/*")) {
    //process
}else{
    this.throw(415,"image only!");
}

內(nèi)容協(xié)商 Content Negotiation
koa請(qǐng)求request包含有用的內(nèi)容寫上工具,由acceptsnegotaitor支持實(shí)現(xiàn),這些工具是:

request accepts(types)

rquest acceptsEncoding(types)

rquest acceptsCharsets(charsets)

rquest acceptsLanguages(langs)
如果沒(méi)有提供類型,那么所有可接受的類型將被返回。

如果提供了多個(gè)類型,最優(yōu)匹配獎(jiǎng)杯返回。如果沒(méi)有匹配到,返回false,并且你應(yīng)該發(fā)送406 "Not Acceptable"返回response給客戶端。

在可以接受任何類型的地方丟失了accept頭部。第一個(gè)匹配到的將被返回。因此提供科技收的類型是很重要的。

request.accepts(types)

檢查給定的類型是否是可接受的。當(dāng)為true則返回最佳匹配,否則false。類型`type`的值也許是一個(gè)或者多個(gè)mime類型字符,例如"application/json",擴(kuò)展名是"josn",或者一個(gè)數(shù)組`["josn","html","text/plain"]`。

//Accept:text/html
this.accepts("html")
//=>"html"

//Accept:text/*, application/json
this.accepts("html")
//=>"html"
this.accepts("json", "text")
//=>"json"
this.accepts("application/json")
//=>"application/json"

//Accept.text/*, application/json
this.accepts("image/png")
this.accepts("png")
//=>false

//Accept:text/*,q=.5, application/json
this.accepts(["html", "json"])
this.accepts("html", "json")
//=>json

//No Accepts header
this.accpts("html", "json")
//=>html
this.accepts("json","html")
//=> json

你也許調(diào)用this.accepts()很多次,或者使用switch語(yǔ)句。

switch(this.accepts("json", "html", "text")) {
    case "json": bareak;
    case "html": bareak;
    case "text": bareak;
    default: this.throw(406, "json , html or text only");
}

request.acceptsEncodings(encodings)

檢查編碼`encodings`是否可接受,true時(shí)返回最優(yōu)匹配,否則返回false。
注意,你應(yīng)該包含一個(gè)`indentity`作為編碼`encodings`之一。

//Accept-Encoding:gzip
this.acceptsEncodings("gzip", "deflate", "identify");
//=>gzip

this.acceptsEncodings(["gzip", "deflate", "identify"])
//=>gzip

當(dāng)沒(méi)有參數(shù)時(shí),所有可接受的編碼作為數(shù)組元素返回

//Accept-Encoding:gzip, deflate
this.acceptsEncodings();
//=>["gzip","deflate","identify"]

注意如果用戶明確發(fā)送identify為identify,q=0。雖然這是個(gè)特殊例子,你仍然需要處理這個(gè)情況,當(dāng)方法返回false時(shí)。

request.acceptsCharsets(charsets)

檢查charset是否可接受,為true時(shí)返回最優(yōu)匹配,否則返回false。

//Accept-Charset:utf-8, iso-8859-1;q=0.2,utf-7;q=0.5

this.acceptsCharsets("utf-8","utf-7")
//=>utf-8

this.acceptsCharsets(["utf-7","utf-8"]);
//=>utf-8

如果沒(méi)有參數(shù)是則返回所有可接受的編碼到一個(gè)數(shù)組。

//Accept-Charset:utf-8,iso-8859-1;q=0.2,utf-7;q=0.5
this.acceptsCharsets();
//=>["utf-8","utf-7","iso-8859-7"]

request.acceptLanguages(langs)

檢查langs是否可接受,如果為true則返回最有匹配,否則返回false。

//Accept-Language:en;q=0.8,es,pt
this.acceptsLanguages("es","en");
//=>"es"

this.acceptsLanguages(["en","es"]);
//=>"es"

當(dāng)沒(méi)有傳入?yún)?shù)則返回所有的語(yǔ)言。

//Accept-Language:en;q=0.8, es,pt
this.acceptsLanguages();
//=>["es", "pt", "en"]

request.idempotent

價(jià)差請(qǐng)求是否idempotent(冪等)

request.socket

返回請(qǐng)求的socket

request.get(field)

返回請(qǐng)求頭header

返回 Response

一個(gè)koa返回Response對(duì)象是個(gè)建立在node請(qǐng)求request之上的抽象。提供了一些額外的功能,這對(duì)每個(gè)http服務(wù)器開(kāi)發(fā)者來(lái)說(shuō)非常有用。

API

response.header
返回header對(duì)象

response。headers
返回header對(duì)象。response.header的別名

response.status
返回response的狀態(tài),默認(rèn)情況下response.status沒(méi)有默認(rèn)值,而res.statusCode的默認(rèn)值是200。

response.status =
通過(guò)數(shù)字設(shè)置狀態(tài)值

100 "continue"繼續(xù)

101 "switch protocols"換協(xié)議

102 "processing"處理中

200 "ok" ok

201 "created"已創(chuàng)建

202 "accepted" 已接受

203 "non-authoritative information"無(wú)作者信息

204 "no content" 無(wú)內(nèi)容

205 "reset content" 重置內(nèi)容

206 "partial content" 部分內(nèi)容

207 "multi-status" 多狀態(tài)

300 "multiple choices" 多選擇

301 "moved permanently" 移動(dòng)到永久

302 "moved temporarily" 移動(dòng)到暫時(shí)

303 "see other" 看其他

304 "not modified" 沒(méi)有改動(dòng)

305 "use proxy" 使用代理

307 "temporary redirect" 暫時(shí)改向

400 "bad request" 壞請(qǐng)求

401 "unauthorized" 未經(jīng)授權(quán)

402 "payment required" 要求付款

403 "forbidden" 禁止

404 "not found" 沒(méi)有發(fā)現(xiàn)

405 "method not allowed" 方法不允許

406 "not acceptable" 不接受

407 "proxy authentication required" 要求代理授權(quán)

408 "request time-out" 請(qǐng)求超時(shí)

409 "conflict" 沖突

410 "gone" 消失

411 "length required" 要求長(zhǎng)度

412 "precondition failed" 預(yù)處理失敗

413 "request entity too large" 請(qǐng)求量太大

414 "request-uri too large" 請(qǐng)求同意資源太大

415 "unsupported media type" 不支持的媒體類型

416 "requested range not satisfiable" 不滿足請(qǐng)求范圍

417 "expectation failed" 不是期望值

418 "i"m a teapot" 我是個(gè)茶壺???

422 "unprocessable entity" 錯(cuò)誤實(shí)體

423 "locked" 已鎖定

424 "failed dependency" 依賴錯(cuò)誤

425 "unordered collection" 未預(yù)定集合

426 "upgrade required" 要求更新

428 "precondition required" 要求前提

429 "too many requests" 過(guò)多請(qǐng)求

431 "request header fields too large" 請(qǐng)求頭的域太大

500 "internal server error" 服務(wù)器內(nèi)部錯(cuò)誤

501 "not implemented" 沒(méi)有實(shí)現(xiàn)

502 "bad gateway" 網(wǎng)關(guān)錯(cuò)誤

503 "service unavailable" 不可服務(wù)

504 "gateway time-out" 網(wǎng)關(guān)超時(shí)

505 "http version not supported" http版本不支持

506 "variant also negotiates" 多樣協(xié)商

507 "insufficient storage" 存儲(chǔ)不足

509 "bandwidth limit exceeded" 超過(guò)帶寬

510 "not extended" 擴(kuò)展錯(cuò)誤

511 "network authentication required" 要求網(wǎng)路授權(quán)證明
注意:不要擔(dān)心要記太多東西,你可以隨時(shí)查看。

response.message
得到返回狀態(tài)的信息。默認(rèn)情況下,response.message是和response.status匹配的。

response.message=
設(shè)置返回狀態(tài)信息。

response.length=
設(shè)置內(nèi)容的長(zhǎng)度

response.length
返回內(nèi)容的長(zhǎng)度,或者計(jì)算出的this.body的大小。值為數(shù)字。或者undifined

response.body
得到response的body。

response.body=
設(shè)置返回體(response.body)為如下之一:

String written

Buffer written

Stream piped

Object json-stringified

null no content response

String
Content-type是text/html或者text/plain,charset是utf-8.Content-length也需要設(shè)置。
Buffer
Content-type是application/octet-stream,Content-length也要設(shè)置。
Stream
Content-type是application/octet-stream.
Object
Content-type是application/json.

response.get(field)
得到response頭部的field的值,不區(qū)分大小寫。

var etag = this.get("ETag");

response.set(field, value)

設(shè)置response頭部field的值。

this.set("Cache-control", "no-cache");

response.append(field, value)

給頭部添加額為的域和值。

this.append("Link", "");

response.set(fields)

使用對(duì)象設(shè)置頭部的fields

this.set({
    "Etag":"1234",
    "Last-modified":date
});

response.remove(field)

移除頭部的某個(gè)域。

resposne.type

返回Content-type的類型,沒(méi)有其他參數(shù)——如‘charset’。

var ct = this.type;
//=>image/png

response.type

通過(guò)名字或者擴(kuò)展名設(shè)置Content-type

this.type = "text/plain;charset=utf-8";
this.type = "image/png";
this.type=".png";
this.type="png";

注意,每個(gè)字符編碼charset都是為你選的最合適的,例如response.type="html",那么默認(rèn)的字符編碼是utf-8,然而明確定義一個(gè)完整的類型,如response.type="text/html",將不會(huì)有指定的字符編碼。

response.is(type...)

很類似于`this.request.is()`。檢查response的類型是否是被支持的類型。這在創(chuàng)建那些對(duì)返回進(jìn)行操作的中間件是非常有用。

示例:這是一個(gè)壓縮html返回response的中間件,除了stream不被壓縮。

var minify = require("html-minifier");

app.use(function *minifyHtml(next){
    yield next;

    if(!this.response.is("html")) return;

    var body = this.body;
    if(!body||body.pipe) return;

    if(Buffer.isBuffer(body)) body = body.toString();
    this.body = minify(body);
})

response.redirect(url, [alt])

把[302]狀態(tài)碼重導(dǎo)向至`url`。
字符串`back`是一個(gè)特殊的例子,提供了引用這支持,當(dāng)引用者不存在或者`/`沒(méi)有使用。

this.redirect("back");
this.redirect("back","/index.html");
this.redirect("login");
this.redirect("http://google.com");

為了改變默認(rèn)的狀態(tài)302,只需在這個(gè)狀態(tài)嗎出現(xiàn)之前或者出現(xiàn)之后進(jìn)行重導(dǎo)向即可。為了改變body,在其調(diào)用之后進(jìn)行重定向。

this.status = 301;
this.redirect("/cart");
this.body = "Redirecting to shopping cart";

response.attachment([filename])

設(shè)置`Content-disposition`為"attachment"為客戶端發(fā)出下載的信號(hào)。
文件的名字是可以指定的。

response.headerSent

檢查返回頭response header是否早已發(fā)送。查看客戶端是否通知錯(cuò)誤信號(hào)非常有用。

response.lastModified

返回`Last-Modified`最后修改頭部的數(shù)據(jù)(如果存在)。

response.LastModified=

設(shè)置`Last-Modified`頭部為一個(gè)合適的UTC(國(guó)際標(biāo)準(zhǔn)時(shí)間)字符串。你也可以設(shè)置其為一個(gè)日期或者日期字符串。

this.response.lastModified = new Date();

response.etag=

設(shè)置ETag到一個(gè)返回中,包括外面的雙引號(hào)。注意,這里沒(méi)有相應(yīng)的response.etag的getter。

this.response.etag = crypto.createHash("md5"),update(this.body).digest("hex");

response.vary(field)
激活field。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/82821.html

相關(guān)文章

  • 2017-07-17 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選聽(tīng)說(shuō)你沒(méi)來(lái)總結(jié)個(gè)人使用過(guò)的移動(dòng)端布局方法新特性簡(jiǎn)介用寫組件坦然面對(duì)應(yīng)對(duì)前端疲勞中文深入理解筆記函數(shù)前端架構(gòu)經(jīng)驗(yàn)分享系列教程之創(chuàng)建頁(yè)面元素龍?jiān)迫珬O盗薪坛讨ㄎ豁?yè)面元素龍?jiān)迫珬5谄谂c表單驗(yàn)證技術(shù)周刊期知乎 2017-07-17 前端日?qǐng)?bào) 精選 聽(tīng)說(shuō)你沒(méi)來(lái) JSConf 2017?總結(jié)個(gè)人使用過(guò)的移動(dòng)端布局方法 - Rni-L - SegmentFaultNode.js v8....

    caiyongji 評(píng)論0 收藏0
  • 2017年1月前端月報(bào)

    摘要:平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。年以前看這個(gè)網(wǎng)址概況在線地址前端開(kāi)發(fā)群月報(bào)提交原則技術(shù)文章新的為主。 平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開(kāi)發(fā)群月報(bào) 提交原則: 技...

    FuisonDesign 評(píng)論0 收藏0
  • 2017年1月前端月報(bào)

    摘要:平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。年以前看這個(gè)網(wǎng)址概況在線地址前端開(kāi)發(fā)群月報(bào)提交原則技術(shù)文章新的為主。 平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開(kāi)發(fā)群月報(bào) 提交原則: 技...

    ivyzhang 評(píng)論0 收藏0
  • 2017年1月前端月報(bào)

    摘要:平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。年以前看這個(gè)網(wǎng)址概況在線地址前端開(kāi)發(fā)群月報(bào)提交原則技術(shù)文章新的為主。 平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開(kāi)發(fā)群月報(bào) 提交原則: 技...

    CloudwiseAPM 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

ZHAO_

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<