中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

從零學習node.js之express入門(六)

發布時間:2020-10-02 06:19:19 來源:腳本之家 閱讀:155 作者:Wenzi 欄目:web開發

一、 介紹

什么是express,為什么要使用express?根據官方網站的說法,express是一個基于 Node.js 平臺的極簡、靈活的web應用開發框架,它提供一系列強大的特性、豐富的API接口,對web應用的接口進行了二次的封裝,提供了MVC模式,方便我們可以快速地創建各種web和移動應用。

Express 框架核心特性:

  1. 可以設置中間件來響應 HTTP 請求。
  2. 定義了路由表用于執行不同的 HTTP 請求動作。
  3. 可以通過向模板傳遞參數來動態渲染 HTML 頁面。

本文也只是簡單的了解下express框架的內容,希望大家能比較快速的入門,更多詳細的內容還是閱讀官網并查看相關的API。

express的中文官方網站:【Express】

二、入門

創建一個目錄myapp,進入到myapp后,使用命令npm express --save-dev把express安裝到本地,然后創建app.js(或server.js)作為程序的入口。

// app.js
var express = require('express');
var app = express();

app.get('/', function(req, res){
 res.send('hello world');
});

app.listen(3000, function(){
 console.log('server has running at port 3000');
})

運行app.js文件:

$ node app.js
server has running at port 3000

在瀏覽器中訪問http://127.0.0.1:3000/就能看到頁面上輸出的hello world。說明基本的express程序可以正常運行了。

2.1 APP

引入express模塊后,執行express()得到一個app實例,app實例中有get, post, use, listen等方法。

app.get(path, handler) : 當使用get方法訪問路徑path時,執行handler指定的方法,而且handler方法還帶有req和res兩個參數供我們使用。req是請求過來時帶的信息,比如參數query, body, 頭部header等; res是我們作為服務器想要返回給瀏覽器的信息設置。res.send(‘hello world')表示是向頁面中發送'hello world'字符串。

當然,如果想要接收post過來的請求,可以使用 app.post(path, function(req, res){}) 接收post到path的請求。

app.listen用來監聽本地的端口后運行web程序,監聽成功后執行回調函數。

2.2 路由

我們在之前講解《從零學習node.js之搭建http服務器(二)》也說過一點路由的內容,不過那時候我們制定的路由規則非常簡單,而且只是處理了3個左右的頁面而已。而express則對路由功能進行豐富。

  1. app.get(path, handler) : get方式訪問path路徑
  2. app.post(path, handler) : post方式訪問path路徑
  3. app.put(path, handler) : put方式訪問path路徑
  4. app.delete(path, handler) : delete方式訪問path路徑
  5. app.all(path, handler) : 任何方式訪問path路徑

同時,我們也應該注意的是: /是表示根路徑下,/user是表示user路徑下,如果訪問/user/login時,是直接訪問/user/login路由的,前面的兩個路由是不訪問的。

// 根路徑下的請求
app.get('/', function(req, res){
 console.log('hello world');
 res.send('hello world');
});

// /user路徑下的請求
app.get('/user', function(req, res){
 console.log('user');
 res.send('huser');
});

// /user/login下的請求
app.get('/user/login', function(req, res){
 console.log('user/login');
 res.send('user/login');
});

而且,path路徑還可以通過字符串匹配和正則匹配的方式進行路由選擇。

2.3 RES響應方法

我們在剛上面的例子中,使用res.send()向頁面中輸出一段'hello world'的純文本字符串,而且res.send()也可以輸出其他類型的數據,比如html字符串(瀏覽器可以解析),Buffer類型,Object類型,Array類型等。

比如我們要輸出一段html字符串。

var html = '<!DOCTYPE html>\
   <html lang="en">\
    <head>\
     <meta charset="UTF-8" />\
     <title>Document</title>\
    </head>\
    <body>\
     <div>\
      <p >hello world</p>\
      <p><input type="text" /></p>\
     </div>\
    </body>\
   </html>';

app.get('/', function(req, res, next){
 res.send(html);
});

我們可以在瀏覽器上一個紅色的hello world和一個文本輸入框。但是若html的代碼比較長,我們可以把這些代碼都放到一個單獨的html文件里,然后使用res.sendFile()方法,將html文件里的內容輸出到頁面中。

在根目錄下創建一個index.html文件,把完整的html代碼放進去,然后:

app.get('/', function(req, res, next){
 res.sendFile('index.html');
});

這樣就能在瀏覽器中看到一個完整的頁面了。

此外,res中還提供了一些別的方法供我們使用:

方法 描述
res.download() 下載文件。
res.end() 終結響應處理流程。
res.json() 發送一個 JSON 格式的響應。
res.jsonp() 發送一個支持 JSONP 的 JSON 格式的響應。
res.redirect() 重定向請求。
res.render() 渲染視圖模板。
res.send() 發送各種類型的響應。
res.sendFile 以八位字節流的形式發送文件。
res.sendStatus() 設置響應狀態代碼,并將其以字符串形式作為響應體的一部分發送。

三、中間件

上面我們執行app.get('/', function(){})時,里面的回調函數就是中間件。中間件其實就是一個函數,在使用app.get, app.post, app.use等方法時,都是在調用中間件作為回調函數。 中間件都可以調用req和res對象,如果多個中間件順序向下執行的話,上一個中間還需要一個next變量,來調用下一個中間件。

這里app.use的使用方法與app.get一樣,都是有兩個參數:path和回調函數,而在這里,path參數是可以忽略不寫的(忽略不寫則每個請求都會執行該中間件)。

// 任何的請求,該中間件都會響應
app.use(function(req, res, next){
 console.log('index m url: '+req.url);
 next(); // 若沒有next(),則請求就會被掛起,一直等待
})

// /topic 下的請求都會響應,包括 /topic/1.html, /topic/c/1.html等
app.use('/topic', function(req, res, next){
 console.log('topic m url: '+req.url);
 next();
})

// 處理/根目錄下的請求
app.get('/', function(req, res, next){
 res.send('index');
});

// 處理 /topic/1.html 這種類型的請求
app.get('/topic/:id.html', function(req, res, next){
 res.send('topic');
});

我們在瀏覽器中輸入一些不同的url看看:

url 控制臺輸出 瀏覽器輸出 說明
127.0.0.1:3000 index m url: / index
/user index m url: /user Cannot GET /user 中間件響應了不存在頁面的請求
/topic/1.html index m url: /topic/1.html
topic m url: /1.html
topic 兩個use中間件都響應了請求
/topic/c/1.html index m url: /topic/c/1.html
topic m url: /c/1.html
Cannot GET /topic/c/1.html 兩個use中間件都響應了請求,只是沒有路由來對該url進行處理

同時,app.use()app.get()等方法,可以調用多個中間件依次執行,使用next()將控制權交由下一個中間件。多個中間件既可以依次作為傳輸傳遞進去,也可以都放到數組中,也可以兩者混用(app.get等同理):

app.use(path, m1, m2, m3, m4...);
app.use(path, [m1, m2, m3, ...]);
app.use(path, [m1, m2, m3, ...], m7, m8, ...);

在上面代碼的基礎上,我們編寫多個中間件。

// 作為數組方式
app.use([
 function(req, res, next){
  console.log('index m 1');
  next();
 }, function(req, res, next){
  console.log('index m 2');
  next();
 }, function(req, res, next){
  console.log('index m 3');
  next();
 }
])

// 每個中間件作為一個參數
app.get('/topic/:id.html', function(req, res, next){
 // res.send('topic');
 console.log('topic get 1');
 next();
}, function(req, res, next){
 console.log('topic get 2');
 next();
}, function(req, res, next){
 console.log('topic get 3');
 res.send('topic');
});

當我們訪問127.0.0.1/topic/1.html時,在控制臺則會輸出:

index m 1
index m 2
index m 3

topic get 1
topic get 2
topic get 3

說明中間件是依次向下執行的。我們可以在每個中間件都做不同的處理,不過要記得使用next()方法,不然頁面就掛了。
我們在上面看到res中的方法,至少需要調用一個,不然請求就會被掛起,一直等待或404。如果對外沒有任何的回復,也可以使用res.end()結束。同時,如果在某個中間件中使用了res中的方法,則后面的中間件不再調用。

總結

這里我們也是簡要的了解了下express框架,更多的內容還是需要查看官網網站。之后我們將使用express構建一個簡單的論壇系統。感興趣的朋友們請繼續關注億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽阳县| 呼图壁县| 陕西省| 噶尔县| 嘉荫县| 肥乡县| 威海市| 南平市| 临城县| 陕西省| 古浪县| 大洼县| 报价| 平安县| 镇巴县| 吴旗县| 永寿县| 罗山县| 阿拉善右旗| 饶平县| 新民市| 万安县| 财经| 布拖县| 正镶白旗| 文登市| 册亨县| 任丘市| 宁化县| 江安县| 资源县| 深水埗区| 大余县| 习水县| 林芝县| 邮箱| 汾阳市| 长宁区| 永泰县| 太仓市| 武川县|