>웹 프론트엔드 >JS 튜토리얼 >express.js 미들웨어 소개(예제 포함)

express.js 미들웨어 소개(예제 포함)

不言
不言앞으로
2019-03-19 10:38:191762검색

이 기사는 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);

中间件

中间件是一个位于实际请求处理程序之上的回调。它采用与路由处理程序相同的参数。

要了解中间件,我们来看一个带有dashboardprofile页面的示例站点。要访问这些页面,用户必须登录。还会记录对这些页面的请求。

以下是这些页面的路由处理程序的代码:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제