本篇是Express 4.0 API翻譯的第三篇,本篇的內容主要是Response的相關操做。html
支持連貫調用的node’s的 res.statusCode = 的別名。node
1 res.status(404).sendfile('path/to/404.png');
設置請求頭的字段爲指定的值,或者經過一個對象一次設置多個值。express
1 res.set('Content-Type','text/plain'); 2 3 res.set({ 4 'Content-Type':'text/plain', 5 'Content-Length':'123', 6 'ETag':'12345' 7 });
別名爲:res.header(field,[value]); 。json
獲取不區分大小寫的響應頭 「field」(字段)。api
1 res.get('Content-Type'); 2 //=>"text/plain"
設置cookie name 的值爲 value,接受參數能夠一個字符串或者是對象轉化成的JSON,path 默認設置爲’/’。數組
1 res.cookie('name','tobi',{domain:'.example.com',path:'/admin',secure:true}); 2 res.cookie('rememberme','1',{expires:new Date(Date.now() + 900000),httpOnly:true});
最大生存期參數[maxAge] 是一個方便的設置項來設置過時時間,值爲相對於當前時間的毫秒時間。下面的代碼就是這樣的一個例子。瀏覽器
1 res.cookie('rememberme','1',{maxAge:900000,httpOnly:true});
當一個對象被序列化爲JSON後是能夠被設置爲值的,而且它也會自動被bodyParser()中間件解析。緩存
1 res.cookie('cart',{items:[1,2,3]}); 2 res.cookie('cart',{items:[1,2,3]},{maxAge:900000});
被簽名的cookie也一樣被支持經過這種方法設置,簡單的經過signed參數。當被給定的res.cookie()將會使用經過cookieParser(secret)傳遞進來的參數來簽名。cookie
1 res.cookie('name','tobi',{signed:true});
以後你就能夠經過req.signedCookie對象來訪問這個值。app
清除名爲 name 的cookie ,默認做用域爲’/’
1 res.cookie('name','tobi',{path:'/admin'}); 2 res.clearCookie('name',{path: '/admin'});
重定向至給定的 url 而且支持指定 status 代碼,默認爲 302 方式
1 res.redirect('/foo/bar'); 2 res.redirect('/http://example.com'); 3 res.redirect(301,'http://example.com'); 4 res.redirect('../login');
Express支持 一下幾種重定向首先是經過全的符合規則的URL重定向到一個徹底不一樣的域名。
1 res.redirect('http://google.com');
第二點是相對根域名重定向,例如,若是你想從http://example.com/admin/post/new 跳轉至 /admin 下,你使用下面的代碼,將會是你跳轉到http://ehttp://example.com/admin
1 res.redirect('/admin');
第三點是相對於掛載點跳轉,例如,若是你的博客程序掛載在’/blog’,而事實上,它是不知道本身被掛載在哪裏的,此時你想重定向至’/admin/post/new’下,你將會被帶到’http://example.com/admin/post/new’ 使用下面的代碼,將會將頁面重定向至’http://example.com/blog/admin/post/new’
1 res.redirect('admin/post/new');
固然也是容許頁面路徑相對跳轉的。若是你如今在’http://example.com/admin/post/new’,使用下面的代碼,你能夠被帶到’http://example.com/admin/post’
1 res.redirect('..');
最後還有一種特殊的跳轉,即’back’重定向,它會將您重定向至 Referer (或者是Referrer),當來源不存在時默認定向至 ‘/’下。
1 res.redirect('back');
設置location響應頭
1 res.location('/foo/bar'); 2 res.location('/foo/bar'); 3 res.location('http://example.com'); 4 res.location('../login'); 5 res.location('back');
可使用與res.redirect()相同的urls
例如,若是你的程序被掛載在/blog 下面的代碼將會將location響應頭賦值爲/blog/admin
1 res.location('admin');
發送一個響應。
1 res.send(new Buffer('whoop')); 2 res.send({sond:'json'}); 3 res.send('some html'); 4 res.send(404,'Sorry, we cannot find that!'); 5 res.send(500,{error:'something blew up'}); 6 res.send(200);
在簡單的non-streaming響應時,這個方法會自動進行一些有用的任務。例如若是以前沒有定義過Content-Length,他會自動分配,它會自動設置一些HEAD信息,或者HTTP緩存支持。
當傳入的內容爲指定的Buffer,那麼Content-Type會被設置爲」application/octet-stream」 除非你預先執行了下面的定義。
1 res.set("Content-Type",'text/html'); 2 res.send(new Buffer('some html'));
當一個數組或者是對象被傳入Express將會自動轉化爲JSON的形式響應:
1 res.send({user:'tobi'}); 2 res.send([1,2,3]);
最後,若是給定的參數是一個數字,並且沒有上面提到的任何一個響應體,Express會爲你設置一個默認的響應體。例如200 將會被設置響應體爲 「OK」 和 404 將會被設置爲」Not Found」 等。
1 res.send(200) 2 res.send(404) 3 res.send(500)
發送一個JSON響應。這個方法與res.send()是徹底相同的,當一個對象或者數組被傳入的時候。然而它或許是有用的,例如在轉化一些非對象(null,undefined,等等),由於這些並非有效的JSON。
1 res.json(null) 2 res.json({user:'tobi'}); 3 res.json(500,{error:'message'});
發送一個支持JSONP的JSON響應。這個方法是和res.json()徹底相同的,可是它支持JSONP callback
1 res.jsonp(null); 2 //=>null 3 res.jsonp({user:'tobi'}); 4 //=>{"user": "tobi"} 5 res.jsonp(500,{error:'message'}) 6 //=>{"error":"message"}
默認的JSONP回調函數名字是callback ,然而你能夠經過jsonp callback name 設置項來設置,下面的代碼是使用jsonp的一些例子。
1 // ?callback=foo 2 res.jsonp({user:'tobi'}) 3 //=>foo({"user":"tobi"}) 4 app.set('jsonp callback name','cb') 5 6 //?cb=foo 7 res.jsonp(500,{error:'message'}); 8 //=>foo({"error":"message"});
將內容的類型設置爲MIME類型的 type ,能夠是簡寫,也能夠是存在’/’的字符串。當’/’存在時,類型就肯定爲type
1 res.type('.html'); 2 res.type('html'); 3 res.type('json'); 4 res.type('application/json'); 5 res.type('png');
設置特定請求頭的響應,這個方法是使用req.accepted,這個是一個根據其可接受類型的重要性排序的數組,不然,第一個回調函數將會被調用。當沒有合適的匹配時,系統返回406 「NotAcceptable」 或者調用 default 回調函數。
Content-Type會被設置好在你被選擇的回調函數執行的時候,然而你能夠經過res.set()或者res.type()更改這裏的類型。
下面的例子爲在接受請求頭字段被設置爲」application/json」或者」*/json」的時候回返回{「message」:」hey」},然而,若是」*/*」時將會返回」hey」。
1 res.format({ 2 'text/plain':function(){ 3 res.send('hey'); 4 }, 5 'text/html':function(){ 6 res.send('hey'); 7 }, 8 'application/json':function(){ 9 res.send({message:"hey"}); 10 } 11 });
除了使用一些標準的MIME類型,你也能夠是用擴展名映射這些類型,下面是一些詳細的展現。
1 res.format({ 2 text:function(){ 3 res.send('hey'); 4 }, 5 html:function(){ 6 res.send('hey'); 7 }, 8 json:function(){ 9 res.send({message:'hey'}); 10 } 11 });
設置響應頭」Content-Disposition」的值爲」attachment」。若是一個文件被給定,而後Content-Type將會被自動設置爲基於其擴展名的的類型經過res.type(),而後Content-Disposition的」filename=」字段將會自動被設置。
1 res.attachment(); 2 //Content-Disposition :attachment 3 res.attachment('path/to/logo.png'); 4 //Content-Disposition : attachment;filename="logo.png" 5 //Content-Type: image/png
path用來傳遞文件的路徑。
經過文件的擴展名將會自動設置默認的Content-Type,而後回調函數 fn(err)將會被調用在傳送後或者是產生任何錯誤的時候。
Options:
這種方法提供了細粒度的文件存儲縮略圖服務
1 app.get('/user/:uid/photo/:file',function(req,res){ 2 var uid = req.params.uid, 3 file = req.params.file; 4 req.user.mayVierFilesFrom(uid,function(yes){ 5 if(yes){ 6 res.sendfile('/uploads/'+uid+'/'+file); 7 }else{ 8 res.send(403,'Sorry! you cant see that.'); 9 } 10 }) 11 })
點擊此處尋求更多的幫助,send
path傳輸所須要傳輸的文件的路徑,一般瀏覽器會提示用戶下載。瀏覽器彈出的下載文件窗口的文件名和響應頭裏的Content-Disposition 的」filename=」參數是一致的。你也能夠本身定義文件名。
當發生錯誤或者是一個文件傳送完成將會調用回調函數 fn 。這個方法是用res.sendfile()來發送文件。
1 res.download('/report-12345.pdf'); 2 res.download('/report-12345.pdf','report.pdf'); 3 res.download('/report-12345.pdf','report.pdf',function(err){ 4 if(err){ 5 //處理錯誤,可能只有部份內容被傳輸,因此檢查一下res.headerSent 6 }else{ 7 //減小下載的積分值之類的。 8 } 9 });
合併並填充響應頭內的」Link」字段,經過給定的links。
1 res.links({ 2 next:'http://api.example.com/users?page=2', 3 last:'http://api.example.com/users?page=5' 4 });
處理後
1 Link: <http://api.example.com/users?page=2>; rel="next", 2 <http://api.example.com/users?page=5>; rel="last"
一次請求的本地化變量,所以只能保持在一次請求/響應的view的輸出以前,其實這個和API的app.locals是同樣的。
這個對象是放置請求級的信息,此時放置請求的路徑名,驗證過的用戶和用戶設置等等。
1 app.use(function(req,res,next){ 2 res.locals.user = req.user; 3 res.locals.authenticated = ! req.user.anonymous; 4 next(); 5 });
渲染一個view,同時向callback傳遞渲染後的字符串,若是在渲染過程當中有錯誤發生next(err)將會被自動調用。callback將會被傳入一個可能發生的錯誤以及渲染後的頁面,這樣就不會自動輸出了。
1 res.render('index',function(err,html){ 2 //.... 3 }); 4 res.render('user',{name :'Tobi'},function(err,html){ 5 //... 6 })