Node.js學習之路24——Express框架的app對象

1.express()

  • 基于Node.js平臺,快速、開放、極簡的web開發框架。
創建一個Express應用.express()是一個由express模塊導出的入口top-level函數.
const express = require('express');
let app = express();

1.1 靜態資源管理

  • express.static(root, [options])
  • express.static,是Express內置的唯一一個中間件.是基于serve-static開發的,負責托管Express應用內的靜態資源.
  • root,參數指的是靜態資源文件所在的根目錄.
  • options,對象是可選的,支持以下屬性

    • dotfiles,String類型,服務dotfiles的選項.可能的值是allow,deny,ignore,默認值為ignore
    • maxAge,以毫秒為單位設置Cache-Control標題頭的最大屬性或ms格式的字符串,默認為0
    • etag,Boolean類型,啟用或禁用etag生成
    • extensions,Mixed,設置文件擴展
    • index,Boolean類型,發送目錄索引,設置false為禁用
    • redirect,Boolean類型,當路徑是一個目錄時,重定向到尾隨/,
    • etHeaders,Function類型,設置HTTP標頭以供文件使用的函數

1.2. Etag

ETagHTTP1.1中才加入的一個屬性,用來幫助服務器控制Web端的緩存驗證.它的原理是這樣的,當瀏覽器請求服務器的某項資源A時, 服務器根據A算出一個哈希值(3f80f-1b6-3e1cb03b)并通過ETag返回給瀏覽器,瀏覽器把3f80f-1b6-3e1cb03bA同時緩存在本地,當下次再次向服務器請求A時,會通過類似 If-None-Match: "3f80f-1b6-3e1cb03b"的請求頭把ETag發送給服務器,服務器再次計算A的哈希值并和瀏覽器返回的值做比較,如果發現A發生了變化就把A返回給瀏覽器200,如果發現A沒有變化就給瀏覽器返回一個304未修改.這樣通過控制瀏覽器端的緩存,可以節省服務器的帶寬,因為服務器不需要每次都把全量數據返回給客戶端.

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

1.3. 建立基本的HTTP服務器

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 = '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:\\Self\\point\\views','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...)
// 等價于
app.all('*', fn1)
app.all('*', fn2)

1.6. 刪除請求路由

  • app.delete(path, callback [, callback ...])
  • 將HTTP刪除請求路由到具有指定回調函數的指定路徑
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 serverapp.set('username', 'express server');
app.disable('username');
console.log(app.get('username')); //false

1.8. 模板引擎

  • app.engine(ext, callback)
  • 根據不同的模板引擎的擴展名,使用不同的模板
app.engine('jade', require('jade').__express);
app.engine('html', require('ejs').renderFile);

1.9. 設置與獲取屬性

app.set('title', 'text');
console.log(app.get('title')); // text

1.10. get請求

  • app.get(path, callback [, callback ...])
  • HTTP獲取請求路由到具有指定回調函數的指定路徑
app.get('/', function (req, res) {res.send('GET request to homepage');
});

1.11. 監聽端口

  • app.listen(port, [hostname], [backlog], [callback(err)])
  • 監聽端口,主機,最大連接數量,回調函數
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. 路由參數

  • app.param([name],callback(req, res, next, id){...})
將回調觸發器添加到路由參數, 其中名稱是參數的名稱或它們的數組, 函數是回調函數.回調函數的參數是請求對象、響應對象、下一個中間件以及該參數的值 (按該順序).

如果 name 是一個數組, 則回調觸發器按聲明的順序注冊在其中聲明的每個參數.此外, 對于每個已聲明的參數, 除了最后一個外, 回調中的下一個調用將調用下一個聲明的參數的回調.對于最后一個參數, 調用 next 將調用當前正在處理的路由的下一個中間件, 就像如果名稱只是一個字符串一樣.

  • 參數是一個字符串
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
*/
  • 參數是一個數組
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()

  • 返回應用程序的規范化路徑
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){...})
  • 回調函數返回視圖的呈現 HTML

1.15. 路由設置

  • 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){...})
  • 在路徑上裝載中間件函數.如果未指定路徑, 則默認為/
  • 路徑可以是表示路徑、路徑模式、匹配路徑的正則表達式或其組合數組的字符串
  • app.use()中間件可以使用正則匹配路徑,可以有多個中間件函數
  • 可使用的地方
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/personconsole.log(req.baseUrl); // /user/personconsole.log(req.path); // /next();
});
  • 如果使用了app.use(callback()),就不會觸發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');
})

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255373.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255373.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【pyqt5學習】——對話框QDialog學習(QMessageBox、QColorDialog、QFIleDialog、QFontDialog、QInputDialog)

目錄 1、對話框QDialog類別 2、通用對話框 ?編輯 3、消息對話框QMessageBox() 1)消息對話框QMessageBox類型 2)案例 ?編輯 4、輸入對話框QInputDialog 1) 類型 2)案例 5、字體格式對話框QFontDialog 6、顏色對話框QColorDialog 1&…

使用 Mesos 管理虛擬機

摘要 為了滿足渲染、基因測序等計算密集型服務的需求,UCloud 推出了“計算工廠”產品,讓用戶可以快速創建大量的計算資源(虛擬機)。該產品的背后,是一套基于 Mesos 的計算資源管理系統。本文簡要介紹該系統的結構、Mes…

Swift數據類型_整型和浮點型

//swift中的整型和浮點型/***//類型推斷整數是Int 浮點數是Double ,日常使用需要注意不能越界,存儲時間毫秒數 英雄經驗數等等之類內容容易越界整型大多數情況下,你不需要在代碼中指定哪種整型。Swift提供了一種額外的整型,Int類型Java中的long型&#x…

Val編程-套接字

套接字的介紹:http://zh.wikipedia.org/wiki/Berkeley%E5%A5%97%E6%8E%A5%E5%AD%97 主要分為客戶端和服務器。客戶端一般是需要主動去鏈接,需要配置服務器的IP和端口。服務器是被動響應,需要打開相應的端口。端口一般不推薦使用系統端口和常用…

【pyqt5學習】——Qpainter控件學習(文本、圖像、各種圖形)

目錄 1、作用及應用步驟 2、繪制文本drawText() 3、像素級別繪制點(正弦曲線為例) 4、繪制不同樣式的直線 5、繪制弧形、圓形、扇形、圖像等 6、畫刷填充區域QBrush 1、作用及應用步驟 QPainter是一個用于繪制的類,該類可以用于繪制&…

反向代理與Real-IP和X-Forwarded-For(轉)

如下圖所示,客戶端通過Nginx Proxy1 和 Nginx Proxy2 兩層反向代理才訪問到具體服務Nginx Backend(或如Tomcat服務)。那Nginx Backend如何才能拿到真實客戶端IP呢? 接下來我們來看看如何才能獲取到客戶端真實IP。 場景1  場景1是…

Android studio打開之后 cannot load project: java.lang.NUllpointerException

參考來源:http://bbs.csdn.net/topics/391014393 關閉網絡,重新打開Android studio就好了。(但是原因不清楚是為什么?) Internal error. Please report to http://code.google.com/p/android/issuescom.intellij.ide.p…

Val編程-任務編程

不同任務之間可以通過一個標志符來實現互斥事件。 程序代碼&#xff1a; Task2 <span style"font-size:12px;">beginwhile truewait(bTaskFlag)cls()gotoxy(1,1)put("這是Task2")gotoxy(1,2)if bTaskFlagput("BFlag:true ")elseput(&…

【pyqt5學習】——拖拽功能(DragDrop)、剪切板(QApplication.clipboard)

目錄 1、拖拽功能&#xff08;Drag&Drop&#xff09; 2、剪切板&#xff08;QApplication.clipboard&#xff09; 1、拖拽功能&#xff08;Drag&Drop&#xff09; 選擇文本輸入框中的文本&#xff0c;移動到下拉框中自動添加步驟&#xff1a; 1、將文本輸入框設置為可…

oracle12c之 控制pdb中sga 與 pga 內存使用

Memory Management using Resource Manager Oracle數據庫資源管理器(資源管理器)現在可以在多租戶容器數據庫(CDB)中管理可插入數據庫(PDBs)之間的內存使用。這一特性有助于在CDB中維護所有PDBs的性能&#xff0c;確保所有的PDBs都不會占用更多資源&#xff0c;從而導致其他PDB…

[LeetCode] 21. Merge Two Sorted Lists ☆

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 解法&#xff1a; 新建一個鏈表&#xff0c;依次比較兩個鏈表的頭元素&#xff0c;把較小的移到新鏈表中&#xff0c;直到有…

Val編程-特殊函數使用

Waitendmove()和$Waitendmove()使用心得 這是兩個部分&#xff0c;程序運行部分和運動堆棧部分&#xff0c;waitendmove是兩個部分進行交互的一個函數。 一般情況下waitendmove()速度會降到0&#xff0c;相當于blend等于off. 代碼&#xff1a; begincls()userPage()title("…

Redis的五種數據結構

Redis支持持久化只是它的一件武器&#xff0c;它提供了多達5種數據存儲方式&#xff1a; 一 string&#xff08;字符串&#xff09; string是最簡單的類型&#xff0c;你可以理解成與Memcached一模一樣的類型&#xff0c;一個key對應一個value&#xff0c;其上支持的操作與Mem…

【pyqt5學習】——QDateTimeEdit控件學習

目錄 1、同時顯示日期時間QDateTime 2、只顯示日期QDate 3、只顯示時間QTime 4、設置顯示的格式setDisplayFormat 5、 QDateTimeEdit常用信號 6、實例 1、同時顯示日期時間QDateTime # 同時顯示日期時間dateTimeEdit1 QDateTimeEdit()dateTimeEdit2 QDateTimeEdit(QDat…

復選框做成單選效果

function zlClick($id){ var eles document.getElementById($id).children; var srcEle event.srcElement; for(var i0;i<eles.length;i){ if(srcEle.checked){ if(eles[i].value!srcEle.value){ eles[i].checkedfalse; } } } } 技術領域可信計算 其他 申請日 200020012…

013. MVC5過濾器

微軟提供了4中過濾器: 1.Action過濾器: 在Action方法執行之前和Action方法執行之后, 會執行此過濾器中的代碼. 比如在執行public ActionResult Index()方法之前或之后; 也可以說是在方法執行前或執行后; 接口: IactionFilter 抽象類名: ActionFilterAttribute 添加一個實現…

Val編程-讀取漢字

Val編程-讀取漢字 Val編程中&#xff0c;對于漢字的讀取不是很友好&#xff0c;利用fileget直接讀取記事本產生的文件字符串會導致亂碼的產生。因為Val只支持使用utf-8進行編碼&#xff0c;因此讀取的文本需要進行utf-8格式轉換。 在GBK中&#xff0c;漢字占兩個字節。并且…

【pyqt5學習】——菜單欄(QMenu())、工具欄QToolBar學習

目錄 1、菜單欄&#xff08;QMenu()&#xff09;——一般在窗口頂部 1&#xff09;創建菜單欄步驟 2&#xff09;信號與方法 3&#xff09;實操 2、工具欄——一般在菜單欄下方 1&#xff09;創建步驟 2&#xff09;方法與信號 信號&#xff1a; 方法&#xff1a; 3&am…

Java核心技術及面試指南 異常部分的面試題歸納以及答案

4.2.4.1 throw和throws有什么差別&#xff1f;異常&#xff08;Exception&#xff09;和錯誤&#xff08;Error&#xff09;有什么差別&#xff1f; throw語句表示拋出異常&#xff0c;由方法體內的語句處理。throws語句用在方法聲明后面&#xff0c;表示如果拋出異常&#xff…

win7win10 配置wlan熱點

win7 & win10 系統自帶wlan功能&#xff0c;配置方法如下&#xff1a; 命令行輸入: 1. netsh wlan set hostednetwork mode allow ssid "Haha" key12345678 2. netsh wlan start hostednetwork netsh wlan show hostednetwork 轉載于:https://www.cnblogs.com/…