最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解nodejs中Express的中間件

 更新時間:2017年05月19日 09:50:43   作者:小鄭子  
一個Express應用就是在調用各種中間件。可見中間件在web應用開發(fā)中的重要性,有興趣的可以了解一下

Express是一個基于Node.js平臺的web應用開發(fā)框架,在Node.js基礎之上擴展了web應用開發(fā)所需要的基礎功能,從而使得我們開發(fā)Web應用更加方便、更加快捷。

舉一個例子:

用node.js實現(xiàn)一個控制臺打印“hello server”

var http = require('http');
var server = http.createServer(function(req,res){
 console.log("hello server");
});
server.listen(3000);

這樣子的話,當我們需要處理各種請求(主要指GET、POST)時,我們需要將所有請求類型處理的代碼寫在createServer包裹的函數(shù)里。

用Express實現(xiàn)一個控制臺打印“hello server”

var express = require('express');
var app = express();
http.createServer(app);
 
// 處理用戶請求(路由)
app.get("/",function(){
 console.log("hello server");
})

Express處理各種請求是通過Express執(zhí)行函數(shù)去調用對應的方法,這樣是不是更加方便和快捷了。

Express的API文檔完整易懂,2010-01-03陸續(xù)發(fā)布了幾個版本,其中第三版和第四版差異比較大, 主要體現(xiàn)在第三版的中間件基本上都是繼承了connect框架的,而第四版將中間件獨立出來了,不在依賴connect框架。

說到中間件,官網對它的闡述是這樣的:

“Express是一個自身功能極簡,完全是路由和中間件構成一個web開發(fā)框架:從本質上來說,一個Express應用就是在調用各種中間件。”

由此可見,中間件在Express開發(fā)中的重要性,因此這里我們就專門來總結一下中間件。

一、中間件結構

1、app.use([path],function)

path:是路由的url,默認參數(shù)‘/',意義是路由到這個路徑時使用這個中間件

function:中間件函數(shù)

這個中間件函數(shù)可以理解為就是function(request,response,next)

這里安裝是指涉及到第三方中間件的使用時,需要先安裝好,然后在使用。

二、中間件分類

1、內置中間件

 express.static 是Express目前唯一內置的一個中間件。用來處理靜態(tài)資源文件。

什么意思了? 來run一下代碼看看

// index.js
var express = require('express');
var app = express();
 
app.use(express.static(__dirname + '/public'));

啟動服務: node index.js

瀏覽器中訪問: http://localhost:1234/ 展示的/public/index.html內容

瀏覽器中訪問: http://localhost:1234/hello.html 展示的/public/hello.html內容

2、自定義中間件

在上面中間件結構中,我們知道了,中間件使用時的第二個參數(shù)是一個Function,然而,要自定義一個中間件,就是倒騰一番這個Function。

這個function總共有三個參數(shù)(req,res,next);

當每個請求到達服務器時,nodejs會為請求創(chuàng)建一個請求對象(request),該請求對象包含客戶端提交上來的數(shù)據。同時也會創(chuàng)建一個響應對象(response),響應對象主要負責將服務器的數(shù)據響應到客戶端。而最后一個參數(shù)next是一個方法,因為一個應用中可以使用多個中間件,而要想運行下一個中間件,那么上一個中間件必須運行next()。

好了,有了一個大概的了解,下面我定義一些中間件來實現(xiàn)一個路由功能。

var express = require('express');
var app = express();
 
app.use(function(request,response,next){
 if(request.url === '/'){
  response.writeHead(200,{"Content-Type":"text/plain"});
  response.end("This is home\n");
 } else {
  next();
 }
})
app.use(function(request,response,next){
 if(request.url === '/about'){
  response.writeHead(200,{"Content-Type":"text/plain"});
  response.end("This is about\n");
 } else {
  next();
 }
})
app.use(function(request,response,next){
 response.writeHead(404,{"Content-Type":"text/plain"});
 response.end("404 not found!\n");
})
app.listen(1234,'localhost');

瀏覽器中訪問: http://localhost:1234/ 展示This is home

瀏覽器中訪問: http://localhost:1234/about 展示This is about

這樣看是不是使用中間件很輕松就實現(xiàn)了路由的功能,當然,有關Express的路由可以專門拿出來寫寫,哈哈。

3、第三方中間件

有關第三方中間件,這里我們分析幾個比較重要和常用的,知道這幾個的使用,其它的也就會了。

body-parser :解析body中的數(shù)據,并將其保存為Request對象的body屬性。

cookie-parser :解析客戶端cookie中的數(shù)據,并將其保存為Request對象的cookie屬性

express-session :解析服務端生成的sessionid對應的session數(shù)據,并將其保存為Request對象的session屬性

query:這個中間件將一個查詢字符串從URL轉換為JS對象,并將其保存為Request對象的query屬性。這個中間件在第四個版本中已經內置了無需安裝。

下面來一個例子,功能是:用戶可否登錄和在服務端保存登錄態(tài)。

var express = require('express');
// 引入模板引擎
var hbs = require('express-handlebars');
var bodyParser = require('body-parser');
var session = require('express-session');
 
var app = express();
 
// hbs是一個模板引擎
app.engine('hbs',hbs());
app.set('view engine','hbs');
app.set('views','templates');
 
// 數(shù)據庫讀出來的數(shù)據
var userArr = ['wpzheng'];
 
app.use(session({secret:'maizidu'}));
app.use(bodyParser.urlencoded({extended:true}));
 
app.get('/', function(request,response,next){
 var username = request.session.username;
 if(username){
  response.send("hello" + username);
 }else{
  response.render('form');
 }
});
 
app.post('/', function(request,response){
  if(userArr.indexOf(request.body.username)>=0){
   request.session.username = request.body.username;
  }else{
   request.session.destroy();
  }
    // response對象的一個方法 重定向作用
  response.redirect('/');
});
app.listen(1234,'localhost');

如果session沒有保存數(shù)據(測試時可以將服務關閉,session就沒有值了,每次向服務器發(fā)送請求時,服務會創(chuàng)建一個新的session),就會自動跳到登錄頁面。當已登錄過(也就是說有session值),就直接顯示username。

這個例子涉及到模板(hbs)和response的方法(redirect)可以先不管。

三、中間件理解

寫到最后了,回到最開始的問題,你是否理解了什么是Express中間件?

結合上面講解時給出的例子,我們先來分析一下從瀏覽器地址欄輸入url到客戶端顯示數(shù)據之間這個過程到底發(fā)生了什么。

瀏覽器向服務器發(fā)送一個請求后,服務器直接通過request.定位屬性的方式得到通過request攜帶過去的數(shù)據(有用戶輸入的數(shù)據和瀏覽器本身的數(shù)據信息)。這中間就一定有一個函數(shù)將這些數(shù)據分類做了處理,已經處理好了,最后讓request對象調用使用,對的,這個處理數(shù)據處理函數(shù)就是我們要說的 中間件 。由此可見,中間件可以總結以下幾點:

1、封裝了一些處理一個完整事件的功能函數(shù)。

2、非內置的中間件需要通過安裝后,require到文件就可以運行。

3、封裝了一些或許復雜但肯定是通用的功能。

以上所有代碼下載:https://github.com/wenpingzheng/express-js.git

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • nodejs+websocket實時聊天系統(tǒng)改進版

    nodejs+websocket實時聊天系統(tǒng)改進版

    這篇文章主要介紹了nodejs+websocket實時聊天系統(tǒng)的改進版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • node后端與Vue前端跨域處理方法詳解

    node后端與Vue前端跨域處理方法詳解

    從目前我了解的情況來看,前后端跨域使用的方式有很多種,這里記錄我使用最順手的一種,即在后端使用cors跨域,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • NodeJS使用formidable實現(xiàn)文件上傳

    NodeJS使用formidable實現(xiàn)文件上傳

    這篇文章主要為大家詳細介紹了NodeJS使用formidable實現(xiàn)文件上傳的相關方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • node.js +mongdb實現(xiàn)登錄功能

    node.js +mongdb實現(xiàn)登錄功能

    這篇文章主要介紹了node.js +mongdb實現(xiàn)登錄功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • nodejs代碼執(zhí)行繞過的一些技巧匯總

    nodejs代碼執(zhí)行繞過的一些技巧匯總

    這篇文章主要給大家介紹了關于nodejs代碼執(zhí)行繞過的一些技巧,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 使用Node.js find-up在父目錄中高效尋找文件與目錄

    使用Node.js find-up在父目錄中高效尋找文件與目錄

    find-up 是一個小巧但功能強大的 Node.js 包,它能幫助我們實現(xiàn)這一需求,本文將深入探究如何使用 find-up 進行有效搜索,并結合豐富的代碼演示幫助大家快速掌握其用法,需要的朋友可以參考下
    2024-05-05
  • nodejs開發(fā)——express路由與中間件

    nodejs開發(fā)——express路由與中間件

    本篇文章主要介紹了nodejs開發(fā)——express路由與中間件 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 完美解決linux下node.js全局模塊找不到的情況

    完美解決linux下node.js全局模塊找不到的情況

    今天小編就為大家分享一篇完美解決linux下node.js全局模塊找不到的情況,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 詳解Node使用Puppeteer完成一次復雜的爬蟲

    詳解Node使用Puppeteer完成一次復雜的爬蟲

    這篇文章主要介紹了詳解Node使用Puppeteer完成一次復雜的爬蟲,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 使用async、enterproxy控制并發(fā)數(shù)量的方法詳解

    使用async、enterproxy控制并發(fā)數(shù)量的方法詳解

    并發(fā)相信對大家來說都不陌生,這篇文章主要給大家介紹了關于使用async、enterproxy控制并發(fā)數(shù)量的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-01-01

最新評論

宝坻区| 仪征市| 黄骅市| 凤台县| 南汇区| 精河县| 三亚市| 哈巴河县| 固始县| 乐都县| 松潘县| 西乌珠穆沁旗| 新宁县| 喜德县| 庄浪县| 镇沅| 肥东县| 东安县| 华阴市| 平利县| 张北县| 青田县| 濉溪县| 轮台县| 两当县| 上林县| 株洲市| 全南县| 霍邱县| 北安市| 洪泽县| 温州市| 句容市| 正定县| 成武县| 巨野县| 印江| 轮台县| 岳西县| 称多县| 福贡县|