1. ホーム
  2. node.js

[解決済み】Expressjsのmiddlewareとapp.useの実際の意味は何ですか?

2022-04-03 06:20:17

質問

私が見ているほとんどのExpressアプリは app.use という文がありますが、ミドルウェアとは何なのか、そして app.use 文は何をしているのでしょうか?expressのドキュメント自体も少し曖昧です。これらの概念について説明していただけませんか?

どのように解決するのですか?

ミドルウェア

新しいプロジェクトでミドルウェアの概念を分離するのは中途半端なんです。

ミドルウェアは、流すべきアクションのスタックを定義することができます。Expressサーバーそのものがミドルウェアのスタックなのです。

// express
var app = express();
// middleware
var stack = middleware();

次に、ミドルウェアスタックにレイヤーを追加するために .use

// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
  next();
});

ミドルウェアスタックのレイヤーは関数であり、n個のパラメータ(expressでは2個。 req &です。 res ) と next 関数を使用します。

ミドルウェアは、レイヤーが何らかの計算を行い、パラメータを増強して next .

スタックは処理しない限り何もしない。Express は、受信した HTTP リクエストがサーバーでキャッチされるたびにスタックを処理します。ミドルウェアでは、スタックを手動で処理します。

// express, you need to do nothing
// middleware
stack.handle(someData);

より完全な例 :

var middleware = require("../src/middleware.js");

var stack = middleware(function(data, next) {
    data.foo = data.data*2;
    next();
}, function(data, next) {
    setTimeout(function() {
        data.async = true;
        next();
    }, 100)
}, function(data) {
    console.log(data);
});

stack.handle({
    "data": 42
})

expressの用語では、HTTPリクエストが来るたびにexpressに処理させたい操作のスタックを定義するだけです。

コネクトではなく)エクスプレスで言えば、グローバルミドルウェアとルート専用ミドルウェアがあります。つまり、入ってくるHTTPリクエストすべてにミドルウェアスタックをアタッチすることも、特定のルートと相互作用するHTTPリクエストにだけアタッチすることもできるのです。

express & middleware の高度な例 :

// middleware 

var stack = middleware(function(req, res, next) {
    users.getAll(function(err, users) {
        if (err) next(err);
        req.users = users;
        next();  
    });
}, function(req, res, next) {
    posts.getAll(function(err, posts) {
        if (err) next(err);
        req.posts = posts;
        next();
    })
}, function(req, res, next) {
    req.posts.forEach(function(post) {
        post.user = req.users[post.userId];
    });

    res.render("blog/posts", {
        "posts": req.posts
    });
});

var app = express.createServer();

app.get("/posts", function(req, res) {
   stack.handle(req, res); 
});

// express

var app = express.createServer();

app.get("/posts", [
    function(req, res, next) {
        users.getAll(function(err, users) {
            if (err) next(err);
            req.users = users;
            next();  
        });
    }, function(req, res, next) {
        posts.getAll(function(err, posts) {
            if (err) next(err);
            req.posts = posts;
            next();
        })
    }, function(req, res, next) {
        req.posts.forEach(function(post) {
            post.user = req.users[post.userId];
        });

        res.render("blog/posts", {
            "posts": req.posts
        });
    }
], function(req, res) {
   stack.handle(req, res); 
});