이 기사는 express.js 미들웨어(예제 포함)를 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
신규 익스프레스 개발자는 경로 핸들러와 미들웨어의 차이점에 대해 혼동하는 경우가 많습니다. 그래서 그들은 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()
메서드는 경로 경로와 일치하는 다음 경로 핸들러를 호출하는 데 사용됩니다. 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/foo app.all( "/product" , handler); // will match /product // won't match /product/cool <-- important // won't match /product/foo <-- important app.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()
app.all()
, app.get()
, app.post()
>에 전달할 수도 있습니다. app.delete()
및 app.put()
메서드.
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);
대시보드
및 프로필
페이지가 있는 샘플 사이트를 살펴보겠습니다. 이 페이지에 액세스하려면 사용자가 로그인해야 합니다. 이 페이지에 대한 요청도 기록됩니다. 🎜🎜다음은 이 페이지에 대한 경로 처리기의 코드입니다. 🎜rrreee🎜여기서 문제는 중복된 코드가 많다는 것입니다. 즉, logRequest()
및 checkLogin(을 사용해야 합니다. ) 여러 번
기능입니다. 이로 인해 코드 업데이트도 어려워집니다. 따라서 이 문제를 해결하기 위해 두 경로 모두에 대한 공통 경로를 작성할 수 있습니다. 🎜🎜다음은 다시 작성된 코드입니다. 🎜rrreee🎜여기의 코드는 더 깔끔해 보이고 유지 관리 및 업데이트가 더 쉬워졌습니다. 처음 두 개의 정의된 경로 핸들러는 요청을 처리하지 않지만 요청 전처리를 담당하므로 여기서는 미들웨어라고 합니다. 🎜🎜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()은 전체 경로와 일치합니다. 🎜🎜다음은 설명하는 예입니다. 미들웨어 내의 🎜rrreee🎜NEXT()🎜🎜next()는 다음에 선언되는 항목에 따라 다음 미들웨어 또는 경로 핸들러를 호출합니다. 그러나 경로 핸들러의 next()는 다음 경로 핸들러만 호출합니다. 다음에 미들웨어가 있으면 건너뛰세요. 따라서 미들웨어는 모든 경로 처리기보다 먼저 선언되어야 합니다. 🎜🎜다음은 설명할 예입니다. 🎜rrreee🎜이제 app.use()
메서드의 고유성과 이 메서드가 미들웨어 선언에 사용되는 이유를 살펴보겠습니다. 🎜🎜샘플 사이트 코드를 다시 작성해 보겠습니다. 🎜rrreee🎜이 기사는 여기까지입니다. 더 많은 흥미로운 콘텐츠를 보려면 PHP 중국어 웹사이트의 🎜JavaScript Video Tutorial🎜 열을 참조하세요. 🎜위 내용은 express.js 미들웨어 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!