亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

express.js中間件說明詳解

2024-05-06 16:49:13
字體:
來源:轉載
供稿:網友

express的新開發人員往往對路由處理程序和中間件之間的區別感到困惑。因此他們也對app.use(),app.all(),app.get(),app.post(),app.delete()和app.put()方法的區別感到困惑。

在本文中,我將解釋中間件和路由處理程序之間的區別。以及如何正確使用app.use(),app.all(),app.get(),app.post(),app.delete()和app.put()方法。

路由處理

app.use(),app.all(),app.get(),app.post(),app.delete()和app.put()全部是用來定義路由的。這些方法都用于定義路由。路由用于處理HTTP請求。路由是路徑和回調的組合,在請求的路徑匹配時執行。回調被稱為路由處理程序。

它們之間的區別是處理不同類型的HTTP請求。例如: app.get()方法僅僅處理get請求,而app.all()處理GET、POST等請求。

下面是一個例子,如何定義一個路由:

var app = require("express")();app.get("/", function(req, res, next){  res.send("Hello World!!!!");});app.listen(8080);

每個路由處理程序都獲得對當前正在提供的HTTP請求的請求和響應對象的引用。

可以為單個HTTP請求執行多個路由處理程序。這是一個例子:

var app = require("express")();app.get("/", function(req, res, next){  res.write("Hello");  next();});app.get("/", function(req, res, next){  res.write(" World !!!");  res.end();});app.listen(8080);

這里第一個句柄寫入一些響應,然后調用next()。 next()方法用于調用與路徑路徑匹配的下一個路由處理程序。

路由處理程序必須結束請求或調用下一個路由處理程序。

我們還可以將多個路由處理程序傳遞給app.all(),app.get(),app.post(),app.delete()和app.put()方法。

這是一個證明這一點的例子:

var app = require("express")();app.get("/", function(req, res, next){  res.write("Hello");  next();}, function(req, res, next){  res.write(" World !!!");  res.end();});app.listen(8080);

中間件

中間件是一個位于實際請求處理程序之上的回調。它采用與路由處理程序相同的參數。

要了解中間件,我們來看一個帶有dashboard和profile頁面的示例站點。要訪問這些頁面,用戶必須登錄。還會記錄對這些頁面的請求。

以下是這些頁面的路由處理程序的代碼:

var app = require("express")();function checkLogin(){  return false;}function logRequest(){  console.log("New request");}app.get("/dashboard", function(req, res, next){  logRequest();  if(checkLogin()){    res.send("This is the dashboard page");  }  else{    res.send("You are not logged in!!!");  }});app.get("/profile", function(req, res, next){  logRequest();  if(checkLogin()){    res.send("This is the dashboard page");  }  else{    res.send("You are not logged in!!!");  }});app.listen(8080);

這里的問題是有很多重復的代碼,即我們不得不多次使用logRequest()和checkLogin()函數。這也使得更新代碼變得困難。因此,為了解決這個問題,我們可以為這兩條路徑編寫一條通用路徑。

這是重寫的代碼:

var app = require("express")();function checkLogin(){  return false;}function logRequest(){  console.log("New request");}app.get("/*", function(req, res, next){  logRequest();  next();})app.get("/*", function(req, res, next){  if(checkLogin()){    next();  }  else{    res("You are not logged in!!!");  }})app.get("/dashboard", function(req, res, next){  res.send("This is the dashboard page");});app.get("/profile", function(req, res, next){  res.send("This is the dashboard page");});app.listen(8080);

這里的代碼看起來更清晰,更易于維護和更新。這里將前兩個定義的路由處理程序稱為中間件,因為它們不處理請求,而是負責預處理請求。

Express為我們提供了app.use()方法,該方法專門用于定義中間件。 app.use()方法可能看起來與app.all()類似,但它們之間存在很多差異,這使得app.use()非常適合于聲明中間件。讓我們看看app.use()方法是如何工作的:

app.use() 和 app.all() 的不同:

CALLBACK

app.use()只需要一個回調,而app.all()可以進行多次回調。

PATH

app.use()只查看url是否以指定路徑開頭,app.all()匹配完整路徑。

這里有一個例子來說明:

app.use( "/product" , mymiddleware);// will match /product// will match /product/cool// will match /product/fooapp.all( "/product" , handler);// will match /product// won't match /product/cool  <-- important// won't match /product/foo  <-- importantapp.all( "/product/*" , handler);// won't match /product    <-- Important// will match /product/cool// will match /product/foo

NEXT()

中間件內的next()調用下一個中間件或路由處理程序,具體取決于接下來聲明的那個。但是路由處理程序中的next()僅調用下一個路由處理程序。如果接下來有中間件,則跳過它。因此,必須在所有路由處理程序之前聲明中間件。

這里有一個例子來說明:

var express = require('express');var app = express();app.use(function frontControllerMiddlewareExecuted(req, res, next){ console.log('(1) this frontControllerMiddlewareExecuted is executed'); next();});app.all('*', function(req, res, next){ console.log('(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next'); next();});app.all('/hello', function(req, res, next){ console.log('(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next'); next();});app.use(function frontControllerMiddlewareNotExecuted(req, res, next){ console.log('(4) this frontControllerMiddlewareNotExecuted is not executed'); next();});app.get('/hello', function(req, res){ console.log('(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response'); res.send('Hello World');});app.listen(80);

現在我們看到了app.use()方法的唯一性以及它用于聲明中間件的原因。

讓我們重寫我們的示例站點代碼:

var app = require("express")();function checkLogin(){  return false;}function logRequest(){  console.log("New request");}app.use(function(req, res, next){  logRequest();  next();})app.use(function(req, res, next){  if(checkLogin()){    next();  }  else{    res.send("You are not logged in!!!");  }})app.get("/dashboard", function(req, res, next){  res.send("This is the dashboard page");});app.get("/profile", function(req, res, next){  res.send("This is the dashboard page");});app.listen(8080);

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品专区第二| 欧美日韩国产va另类| 日韩欧美第一页| 中文.日本.精品| 秋霞成人午夜鲁丝一区二区三区| 亚洲区一区二区| 久久好看免费视频| 欧美另类第一页| 欧洲亚洲在线视频| 欧美大片在线影院| 成人疯狂猛交xxx| 久久亚洲精品小早川怜子66| 米奇精品一区二区三区在线观看| 国产成人精品日本亚洲专区61| 久久成人国产精品| 精品国产999| 国产精品久久久久久一区二区| 国内精品久久久久久中文字幕| 在线播放日韩专区| 欧美精品video| 欧美国产日本高清在线| 国语自产在线不卡| 在线中文字幕日韩| 国产乱人伦真实精品视频| 亚洲黄色有码视频| 日韩中文字幕欧美| 亚洲精品动漫久久久久| 中文日韩在线视频| 欧美日韩国产中文精品字幕自在自线| 欧美肥婆姓交大片| 久久影院中文字幕| 亚洲美女免费精品视频在线观看| 国产成人精品久久二区二区| 欧美日韩国产中字| 亚洲色图av在线| www.久久色.com| 国产精品免费久久久久影院| 精品国产乱码久久久久久天美| 亚洲欧美成人一区二区在线电影| 91精品视频在线免费观看| 欧美成人免费全部观看天天性色| 亚洲视频第一页| 91中文在线视频| 亚洲黄页网在线观看| 国产精品久久久久久久7电影| 国模叶桐国产精品一区| 亚洲福利小视频| 日韩在线观看免费全集电视剧网站| 国产精品女视频| 国产一区红桃视频| 亚洲免费视频一区二区| 亚洲精品一区二三区不卡| 456国产精品| 亚洲国产欧美一区二区丝袜黑人| 成人精品在线观看| 久久九九热免费视频| 91免费欧美精品| 久久久91精品| 亚洲欧美国内爽妇网| 国产精品一区二区三区成人| 欧美黑人巨大xxx极品| 久久国产一区二区三区| 亚洲人午夜精品| 国产精品成人v| 日韩视频―中文字幕| 亚洲第一区中文99精品| 久久精品99久久久久久久久| 久久久免费在线观看| 亚洲天堂精品在线| 国产原创欧美精品| 成人精品久久av网站| 亚洲成人久久久| 亚洲国产古装精品网站| 欧美第一黄网免费网站| 欧美在线视频观看| 国产精品久久久av| 欧美专区在线视频| 亚洲一区二区三区久久| 在线观看免费高清视频97| 国产精品美腿一区在线看| 精品久久久久人成| 中文字幕精品www乱入免费视频| 日韩高清av一区二区三区| 欧美激情一二区| 日韩av影视综合网| 97在线精品国自产拍中文| 欧美激情女人20p| 色噜噜久久综合伊人一本| 日本精品中文字幕| 亚洲精品在线91| 国产成人精品视频在线| www.久久色.com| 久久久天堂国产精品女人| 国产伊人精品在线| 欧美巨乳在线观看| 国产精品爱久久久久久久| 日韩亚洲欧美中文高清在线| 91色视频在线观看| 久久久精品中文字幕| 人人爽久久涩噜噜噜网站| 久久久亚洲欧洲日产国码aⅴ| 136fldh精品导航福利| 91精品国产91久久| 日韩欧美成人精品| 欧美一区二区三区四区在线| 欧美日韩国产麻豆| 午夜精品视频在线| 欧美日韩亚洲国产一区| 中文字幕在线国产精品| 日韩中文综合网| 亚洲人成网站在线播| 国产精品免费网站| 欧美大片免费看| 亚洲人成欧美中文字幕| 热久久视久久精品18亚洲精品| 色视频www在线播放国产成人| 成人黄色大片在线免费观看| 国产精品视频免费在线| 91精品久久久久久久久不口人| 国产一区二区丝袜高跟鞋图片| 91精品综合视频| 中文字幕精品久久久久| 粉嫩av一区二区三区免费野| 国产精品人人做人人爽| 日韩在线免费av| 成人xxxx视频| 国产精品美女999| 国产成人精品一区二区三区| 日韩精品中文字| 日韩精品中文字| 一本色道久久综合亚洲精品小说| 亚洲专区国产精品| 欧美成人免费全部观看天天性色| 久久久久久久一区二区| 成人黄色免费片| 亚洲精品国产精品久久清纯直播| 亚洲欧美国产日韩中文字幕| 亚洲成人a级网| 欧美成人免费视频| 欧美性受xxxx黑人猛交| 91色在线观看| 亚洲欧美另类国产| 国产精品jvid在线观看蜜臀| 国产精品亚洲自拍| 亚洲男人av电影| 亚洲人成网站色ww在线| 日韩电影视频免费| 中文字幕精品久久| 国产精品专区一| 亚洲一区二区三区在线视频| 2019中文字幕免费视频| 国产精品视频播放| 91久久久久久| 中文字幕无线精品亚洲乱码一区| 日韩亚洲国产中文字幕| 亚洲午夜未删减在线观看| 精品久久久久久久久久ntr影视| 亚洲性生活视频| 亚洲天堂视频在线观看| 91国产美女在线观看| 深夜福利国产精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产成人91久久精品| 久久久国产影院|