国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

express.js中間件說明詳解

2024-05-06 16:49:13
字體:
供稿:網(wǎng)友

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

在本文中,我將解釋中間件和路由處理程序之間的區(qū)別。以及如何正確使用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請求。路由是路徑和回調(diào)的組合,在請求的路徑匹配時執(zhí)行。回調(diào)被稱為路由處理程序。

它們之間的區(qū)別是處理不同類型的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);

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

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

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);

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

路由處理程序必須結(jié)束請求或調(diào)用下一個路由處理程序。

我們還可以將多個路由處理程序傳遞給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);

中間件

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

要了解中間件,我們來看一個帶有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);

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

這是重寫的代碼:

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);

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

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

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

CALLBACK

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

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()

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

這里有一個例子來說明:

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);

現(xiàn)在我們看到了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);

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 维西| 金川县| 武乡县| 富裕县| 波密县| 高台县| 呼玛县| 河曲县| 县级市| 锦州市| 渭源县| 台南市| 安庆市| 阿坝县| 北流市| 区。| 东阳市| 德兴市| 安阳市| 庐江县| 平和县| 洪泽县| 永宁县| 抚州市| 环江| 台江县| 彰化县| 洛宁县| 通州区| 蓝山县| 军事| 固镇县| 淮安市| 行唐县| 论坛| 杨浦区| 宕昌县| 上虞市| 宾川县| 房山区| 乌拉特中旗|