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

資訊專欄INFORMATION COLUMN

Node.js學(xué)習(xí)之路24——Express框架的app對(duì)象

smallStone / 2965人閱讀

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. Etag
ETagHTTP1.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-3e1cb03bA同時(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ù)返回給客戶端.

注:HTTP中并沒(méi)有指定如何生成ETag,哈希是比較理想的選擇.

1.3. 建立基本的HTTP服務(wù)器
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")); //false
1.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")); // text
1.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

相關(guān)文章

  • Node.js學(xué)習(xí)之路26——Expressresponse對(duì)象

    摘要:如果包含字符則將設(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...

    davidac 評(píng)論0 收藏0
  • Node.js學(xué)習(xí)之路25——Expressrequest對(duì)象

    摘要:對(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, ...

    cocopeak 評(píng)論0 收藏0
  • Node.js學(xué)習(xí)之路27——Expressrouter對(duì)象

    摘要:對(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,大小寫敏...

    NicolasHe 評(píng)論0 收藏0
  • Express.js之路(1)

    摘要:什么是它是一個(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...

    HitenDev 評(píng)論0 收藏0
  • Node.js學(xué)習(xí)之路13——HTTP與HTTPS

    摘要:和的區(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...

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

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

0條評(píng)論

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