1.express()
基于Node.js平臺,快速、開放、極簡的web開發(fā)框架。
創(chuàng)建一個Express應(yīng)用.express()是一個由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)置的唯一一個中間件.是基于serve-static開發(fā)的,負責(zé)托管Express應(yīng)用內(nèi)的靜態(tài)資源.
root,參數(shù)指的是靜態(tài)資源文件所在的根目錄.
options,對象是可選的,支持以下屬性
dotfiles,String類型,服務(wù)dotfiles的選項.可能的值是allow,deny,ignore,默認值為ignore
maxAge,以毫秒為單位設(shè)置Cache-Control標題頭的最大屬性或ms格式的字符串,默認為0
etag,Boolean類型,啟用或禁用etag生成
extensions,Mixed,設(shè)置文件擴展
index,Boolean類型,發(fā)送目錄索引,設(shè)置false為禁用
redirect,Boolean類型,當(dāng)路徑是一個目錄時,重定向到尾隨/,
etHeaders,Function類型,設(shè)置HTTP標頭以供文件使用的函數(shù)
1.2. EtagETag是HTTP1.1中才加入的一個屬性,用來幫助服務(wù)器控制Web端的緩存驗證.它的原理是這樣的,當(dāng)瀏覽器請求服務(wù)器的某項資源A時, 服務(wù)器根據(jù)A算出一個哈希值(3f80f-1b6-3e1cb03b)并通過ETag返回給瀏覽器,瀏覽器把3f80f-1b6-3e1cb03b和A同時緩存在本地,當(dāng)下次再次向服務(wù)器請求A時,會通過類似 If-None-Match: "3f80f-1b6-3e1cb03b"的請求頭把ETag發(fā)送給服務(wù)器,服務(wù)器再次計算A的哈希值并和瀏覽器返回的值做比較,如果發(fā)現(xiàn)A發(fā)生了變化就把A返回給瀏覽器200,如果發(fā)現(xiàn)A沒有變化就給瀏覽器返回一個304未修改.這樣通過控制瀏覽器端的緩存,可以節(jié)省服務(wù)器的帶寬,因為服務(wù)器不需要每次都把全量數(shù)據(jù)返回給客戶端.1.3. 建立基本的HTTP服務(wù)器注:HTTP中并沒有指定如何生成ETag,哈希是比較理想的選擇.
const express = require("express"); let app = express(); app.get("/", (req, res) => { res.send("hello world"); }); app.listen(3000);1.4. app對象的locals屬性
可以在locals對象上自定義屬性
app.locals.title = "my express title";
app.locals.email = "[email protected]";
{ 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: "[email protected]" }1.5. app.all(path, callback(req, res, next){...})
app.all("*", fn1, fn2...) // 等價于 app.all("*", fn1) app.all("*", fn2)1.6. 刪除請求路由
app.delete(path, callback [, callback ...])
將HTTP刪除請求路由到具有指定回調(diào)函數(shù)的指定路徑
app.delete("/", function (req, res) { res.send("DELETE request to homepage"); });1.7. 禁用啟用某個屬性
禁用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ù)不同的模板引擎的擴展名,使用不同的模板
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請求
app.get(path, callback [, callback ...])
將HTTP獲取請求路由到具有指定回調(diào)函數(shù)的指定路徑
app.get("/", function (req, res) { res.send("GET request to homepage"); });1.11. 監(jiān)聽端口
app.listen(port, [hostname], [backlog], [callback(err)])
監(jiān)聽端口,主機,最大連接數(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ù)是請求對象、響應(yīng)對象、下一個中間件以及該參數(shù)的值 (按該順序).如果 name 是一個數(shù)組, 則回調(diào)觸發(fā)器按聲明的順序注冊在其中聲明的每個參數(shù).此外, 對于每個已聲明的參數(shù), 除了最后一個外, 回調(diào)中的下一個調(diào)用將調(diào)用下一個聲明的參數(shù)的回調(diào).對于最后一個參數(shù), 調(diào)用 next 將調(diào)用當(dāng)前正在處理的路由的下一個中間件, 就像如果名稱只是一個字符串一樣.
參數(shù)是一個字符串
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ù)是一個數(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)
返回單個路由的實例
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ù).如果未指定路徑, 則默認為/
路徑可以是表示路徑、路徑模式、匹配路徑的正則表達式或其組合數(shù)組的字符串
app.use()中間件可以使用正則匹配路徑,可以有多個中間件函數(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()),就不會觸發(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93059.html
摘要:如果包含字符則將設(shè)置為。添加字段到不同的響應(yīng)頭將該字段添加到不同的響應(yīng)標頭如果它尚未存在。 3. response對象 3.1 是否發(fā)送了響應(yīng)頭 res.headersSent布爾屬性,app是否發(fā)送了httpheaders const express = require(express); const bodyParser = require(body-parser); cons...
摘要:對象表示請求并且具有請求查詢字符串參數(shù)正文標題頭等屬性對應(yīng)用程序?qū)嵗囊帽4媪撕芏鄬κ褂弥虚g件的應(yīng)用程序?qū)嵗囊脪燧d在路由實例上的路徑請求主體和和包含在請求正文中提交的數(shù)據(jù)的鍵值對默認情況下它是未定義的當(dāng)您使用體解析中間件如和時將被填 2. request req對象表示http請求,并且具有請求查詢字符串,參數(shù),正文,http標題頭等屬性 app.get(/user/:id, ...
摘要:對象大小寫敏感默認不敏感保留父路由器的必需參數(shù)值如果父項和子項具有沖突的參數(shù)名稱則該子項的值將優(yōu)先激活嚴格路由默認禁用禁用之后正常訪問但是不可以訪問全部調(diào)用或者或者實際上就是的各種請求方法使用路由使用模塊方法 Router([options]) let router = express.Router([options]); options對象 caseSensitive,大小寫敏...
摘要:什么是它是一個基于平臺,快速開放極簡的開發(fā)框架。在中就是一個重點。這讓我們更加注重業(yè)務(wù)的功能和開發(fā)效率。項目運行我們利用框架可以減少我們的代碼量,比起之前使用的核心模塊構(gòu)建服務(wù)器代碼排版更直觀。 什么是Express.js? 它是一個基于Node.js平臺,快速、開放、極簡的web開發(fā)框架。在Express中就是一個重點:API。這讓我們更加注重業(yè)務(wù)的功能和開發(fā)效率。 如何使用Expr...
摘要:和的區(qū)別服務(wù)器使用協(xié)議服務(wù)器使用協(xié)議服務(wù)器需要向證書授權(quán)中心申請證書一般免費證書何紹需要交費在少許讀客戶端有要求的情況下也會要求客戶端使用證書服務(wù)器于客戶端之間傳輸?shù)氖敲魑臄?shù)據(jù)而服務(wù)器于客戶端之間傳輸?shù)氖墙?jīng)過安全加密后的密文數(shù)據(jù)服務(wù)器通常使 4. HTTP和HTTPS的區(qū)別 HTTPS服務(wù)器使用HTTPS協(xié)議,HTTP服務(wù)器使用HTTP協(xié)議. HTTPS服務(wù)器需要向證書授權(quán)(Ce...
閱讀 2484·2023-04-26 02:18
閱讀 1271·2021-10-14 09:43
閱讀 3841·2021-09-26 10:00
閱讀 6985·2021-09-22 15:28
閱讀 2550·2019-08-30 15:54
閱讀 2611·2019-08-30 15:52
閱讀 486·2019-08-29 11:30
閱讀 3475·2019-08-29 11:05