1.express()
基于Node.js平臺(tái),快速、開(kāi)放、極簡(jiǎn)的web開(kāi)發(fā)框架。
創(chuàng)建一個(gè)Express應(yīng)用.express()是一個(gè)由express模塊導(dǎo)出的入口top-level函數(shù).
const express = require("express"); let app = express();1.1 靜態(tài)資源管理
express.static(root, [options])
express.static,是Express內(nèi)置的唯一一個(gè)中間件.是基于serve-static開(kāi)發(fā)的,負(fù)責(zé)托管Express應(yīng)用內(nèi)的靜態(tài)資源.
root,參數(shù)指的是靜態(tài)資源文件所在的根目錄.
options,對(duì)象是可選的,支持以下屬性
dotfiles,String類型,服務(wù)dotfiles的選項(xiàng).可能的值是allow,deny,ignore,默認(rèn)值為ignore
maxAge,以毫秒為單位設(shè)置Cache-Control標(biāo)題頭的最大屬性或ms格式的字符串,默認(rèn)為0
etag,Boolean類型,啟用或禁用etag生成
extensions,Mixed,設(shè)置文件擴(kuò)展
index,Boolean類型,發(fā)送目錄索引,設(shè)置false為禁用
redirect,Boolean類型,當(dāng)路徑是一個(gè)目錄時(shí),重定向到尾隨/,
etHeaders,Function類型,設(shè)置HTTP標(biāo)頭以供文件使用的函數(shù)
1.2. EtagETag是HTTP1.1中才加入的一個(gè)屬性,用來(lái)幫助服務(wù)器控制Web端的緩存驗(yàn)證.它的原理是這樣的,當(dāng)瀏覽器請(qǐng)求服務(wù)器的某項(xiàng)資源A時(shí), 服務(wù)器根據(jù)A算出一個(gè)哈希值(3f80f-1b6-3e1cb03b)并通過(guò)ETag返回給瀏覽器,瀏覽器把3f80f-1b6-3e1cb03b和A同時(shí)緩存在本地,當(dāng)下次再次向服務(wù)器請(qǐng)求A時(shí),會(huì)通過(guò)類似 If-None-Match: "3f80f-1b6-3e1cb03b"的請(qǐng)求頭把ETag發(fā)送給服務(wù)器,服務(wù)器再次計(jì)算A的哈希值并和瀏覽器返回的值做比較,如果發(fā)現(xiàn)A發(fā)生了變化就把A返回給瀏覽器200,如果發(fā)現(xiàn)A沒(méi)有變化就給瀏覽器返回一個(gè)304未修改.這樣通過(guò)控制瀏覽器端的緩存,可以節(jié)省服務(wù)器的帶寬,因?yàn)榉?wù)器不需要每次都把全量數(shù)據(jù)返回給客戶端.1.3. 建立基本的HTTP服務(wù)器注:HTTP中并沒(méi)有指定如何生成ETag,哈希是比較理想的選擇.
const express = require("express"); let app = express(); app.get("/", (req, res) => { res.send("hello world"); }); app.listen(3000);1.4. app對(duì)象的locals屬性
可以在locals對(duì)象上自定義屬性
app.locals.title = "my express title";
app.locals.email = "express@express.com";
{ settings: { "x-powered-by": true, etag: "weak", "etag fn": [Function: wetag], env: "development", "query parser": "extended", "query parser fn": [Function: parseExtendedQueryString], "subdomain offset": 2, "trust proxy": false, "trust proxy fn": [Function: trustNone], view: [Function: View], views: "E:Selfpointviews", "jsonp callback name": "callback" }, title: "my express title", email: "express@express.com" }1.5. app.all(path, callback(req, res, next){...})
app.all("*", fn1, fn2...) // 等價(jià)于 app.all("*", fn1) app.all("*", fn2)1.6. 刪除請(qǐng)求路由
app.delete(path, callback [, callback ...])
將HTTP刪除請(qǐng)求路由到具有指定回調(diào)函數(shù)的指定路徑
app.delete("/", function (req, res) { res.send("DELETE request to homepage"); });1.7. 禁用啟用某個(gè)屬性
禁用app.disable(name),app.disabled(name)
啟用app.able(name),app.abled(name)
app.set("username", "express server"); console.log(app.get("username")); //express server app.set("username", "express server"); app.disable("username"); console.log(app.get("username")); //false1.8. 模板引擎
app.engine(ext, callback)
根據(jù)不同的模板引擎的擴(kuò)展名,使用不同的模板
app.engine("jade", require("jade").__express); app.engine("html", require("ejs").renderFile);1.9. 設(shè)置與獲取屬性
app.set("title", "text"); console.log(app.get("title")); // text1.10. get請(qǐng)求
app.get(path, callback [, callback ...])
將HTTP獲取請(qǐng)求路由到具有指定回調(diào)函數(shù)的指定路徑
app.get("/", function (req, res) { res.send("GET request to homepage"); });1.11. 監(jiān)聽(tīng)端口
app.listen(port, [hostname], [backlog], [callback(err)])
監(jiān)聽(tīng)端口,主機(jī),最大連接數(shù)量,回調(diào)函數(shù)
const express = require("express"); let app = express(); app.get("/", function (req, res) { res.send("home page"); }); app.listen(3000, "localhost", 100, function (err) { if (err) { console.log("error"); } else { console.log("the http server is running at localhost:3333"); } });1.12. 路由參數(shù)
app.param([name],callback(req, res, next, id){...})
將回調(diào)觸發(fā)器添加到路由參數(shù), 其中名稱是參數(shù)的名稱或它們的數(shù)組, 函數(shù)是回調(diào)函數(shù).回調(diào)函數(shù)的參數(shù)是請(qǐng)求對(duì)象、響應(yīng)對(duì)象、下一個(gè)中間件以及該參數(shù)的值 (按該順序).如果 name 是一個(gè)數(shù)組, 則回調(diào)觸發(fā)器按聲明的順序注冊(cè)在其中聲明的每個(gè)參數(shù).此外, 對(duì)于每個(gè)已聲明的參數(shù), 除了最后一個(gè)外, 回調(diào)中的下一個(gè)調(diào)用將調(diào)用下一個(gè)聲明的參數(shù)的回調(diào).對(duì)于最后一個(gè)參數(shù), 調(diào)用 next 將調(diào)用當(dāng)前正在處理的路由的下一個(gè)中間件, 就像如果名稱只是一個(gè)字符串一樣.
參數(shù)是一個(gè)字符串
app.param("id", (req, res, next, id) => { console.log("called only once"); next(); }); app.get("/user/:id", (req, res, next) => { console.log("although this matches"); next(); }); app.get("/user/:id", (req, res) => { console.log("this matches too"); res.send("end user id"); }); /** called only once although this matches this matches too */
參數(shù)是一個(gè)數(shù)組
app.param(["id", "page"], (req, res, next, id) => { console.log("called only once", id); next(); }); app.get("/user/:id/:page", (req, res, next) => { console.log("although this matches"); next(); }); app.get("/user/:id/:page", (req, res) => { console.log("this matches too"); res.send("end user id"); }); /** called only once kkk called only once 555 although this matches this matches too */1.13. app.path()
返回應(yīng)用程序的規(guī)范化路徑
let express = require("express"); let app = express(); let blog = express(); let blogAdmin = express(); app.use("/blog", blog); blog.use("/admin", blogAdmin); console.log(app.path()); console.log(blog.path()); console.log(blogAdmin.path());1.14. 模板渲染
app.render(view, [locals], callback(err,html){...})
回調(diào)函數(shù)返回視圖的呈現(xiàn) HTML
1.15. 路由設(shè)置app.route(path)
返回單個(gè)路由的實(shí)例
app.route("/one") .all(function (req, res, next) { console.log("route all"); next(); }) .get(function (req, res, next) { res.json({ code: 2589, msg: "route get msg" }); }) .post(function (req, res, next) { res.send("this is route post send msg"); });1.16. 中間件
app.use([path,] callback(req, res, next){...})
在路徑上裝載中間件函數(shù).如果未指定路徑, 則默認(rèn)為/
路徑可以是表示路徑、路徑模式、匹配路徑的正則表達(dá)式或其組合數(shù)組的字符串
app.use()中間件可以使用正則匹配路徑,可以有多個(gè)中間件函數(shù)
可使用的地方
app.use(express.static(__dirname + "/public")); app.use("/static", express.static(__dirname + "/public")); app.use(express.static(__dirname + "/public")); app.use(logger()); app.use(express.static(__dirname + "/public")); app.use(express.static(__dirname + "/files")); app.use(express.static(__dirname + "/uploads"));
中間件示例
app.use("/user/person", (req, res, next) => { console.log(req.originalUrl); // /user/person console.log(req.baseUrl); // /user/person console.log(req.path); // / next(); });
如果使用了app.use(callback()),就不會(huì)觸發(fā)app.get("/", callback())
// this middleware will not allow the request to go beyond it app.use((req, res, next) => { res.send("Hello World"); }) // requests will never reach this route app.get("/", (req, res) => { res.send("Welcome"); })
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/93059.html
摘要:如果包含字符則將設(shè)置為。添加字段到不同的響應(yīng)頭將該字段添加到不同的響應(yīng)標(biāo)頭如果它尚未存在。 3. response對(duì)象 3.1 是否發(fā)送了響應(yīng)頭 res.headersSent布爾屬性,app是否發(fā)送了httpheaders const express = require(express); const bodyParser = require(body-parser); cons...
摘要:對(duì)象表示請(qǐng)求并且具有請(qǐng)求查詢字符串參數(shù)正文標(biāo)題頭等屬性對(duì)應(yīng)用程序?qū)嵗囊帽4媪撕芏鄬?duì)使用中間件的應(yīng)用程序?qū)嵗囊脪燧d在路由實(shí)例上的路徑請(qǐng)求主體和和包含在請(qǐng)求正文中提交的數(shù)據(jù)的鍵值對(duì)默認(rèn)情況下它是未定義的當(dāng)您使用體解析中間件如和時(shí)將被填 2. request req對(duì)象表示http請(qǐng)求,并且具有請(qǐng)求查詢字符串,參數(shù),正文,http標(biāo)題頭等屬性 app.get(/user/:id, ...
摘要:對(duì)象大小寫敏感默認(rèn)不敏感保留父路由器的必需參數(shù)值如果父項(xiàng)和子項(xiàng)具有沖突的參數(shù)名稱則該子項(xiàng)的值將優(yōu)先激活嚴(yán)格路由默認(rèn)禁用禁用之后正常訪問(wèn)但是不可以訪問(wèn)全部調(diào)用或者或者實(shí)際上就是的各種請(qǐng)求方法使用路由使用模塊方法 Router([options]) let router = express.Router([options]); options對(duì)象 caseSensitive,大小寫敏...
摘要:什么是它是一個(gè)基于平臺(tái),快速開(kāi)放極簡(jiǎn)的開(kāi)發(fā)框架。在中就是一個(gè)重點(diǎn)。這讓我們更加注重業(yè)務(wù)的功能和開(kāi)發(fā)效率。項(xiàng)目運(yùn)行我們利用框架可以減少我們的代碼量,比起之前使用的核心模塊構(gòu)建服務(wù)器代碼排版更直觀。 什么是Express.js? 它是一個(gè)基于Node.js平臺(tái),快速、開(kāi)放、極簡(jiǎn)的web開(kāi)發(fā)框架。在Express中就是一個(gè)重點(diǎn):API。這讓我們更加注重業(yè)務(wù)的功能和開(kāi)發(fā)效率。 如何使用Expr...
摘要:和的區(qū)別服務(wù)器使用協(xié)議服務(wù)器使用協(xié)議服務(wù)器需要向證書授權(quán)中心申請(qǐng)證書一般免費(fèi)證書何紹需要交費(fèi)在少許讀客戶端有要求的情況下也會(huì)要求客戶端使用證書服務(wù)器于客戶端之間傳輸?shù)氖敲魑臄?shù)據(jù)而服務(wù)器于客戶端之間傳輸?shù)氖墙?jīng)過(guò)安全加密后的密文數(shù)據(jù)服務(wù)器通常使 4. HTTP和HTTPS的區(qū)別 HTTPS服務(wù)器使用HTTPS協(xié)議,HTTP服務(wù)器使用HTTP協(xié)議. HTTPS服務(wù)器需要向證書授權(quán)(Ce...
閱讀 2477·2023-04-26 02:18
閱讀 1269·2021-10-14 09:43
閱讀 3835·2021-09-26 10:00
閱讀 6981·2021-09-22 15:28
閱讀 2547·2019-08-30 15:54
閱讀 2610·2019-08-30 15:52
閱讀 483·2019-08-29 11:30
閱讀 3473·2019-08-29 11:05