[解決済み】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);
});
関連
-
[解決済み] 再インストールを繰り返しても、npm run でモジュール 'sass' が見つからない。
-
[解決済み] MongoDB でコレクションを日付順に並べるには?
-
[解決済み] nvm は npm config の "prefix" オプションと互換性がありません。
-
[解決済み] MongoNetworkError: 最初の接続でサーバー [localhost:27017] への接続に失敗 [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017] 。
-
[解決済み] -saveと-save-devの違いは何ですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.jsのConnect、Express、「ミドルウェア」って何?
-
[解決済み】Node.js / Express.js - app.routerはどのように動作するのですか?
-
[解決済み】express.jsのapp.useとapp.getの違いについて
-
[解決済み】NodeJS / Express: "app.use "とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】MongoClient v3.0使用時、db.collectionは関数ではない
-
[解決済み】npx コマンドが見つかりません。
-
[解決済み】Mongooseで配列の値を更新する方法
-
[解決済み】Mongooseで、日付でソートするにはどうしたらいいですか?(node.js)
-
[解決済み】Heroku + node.jsのエラー(Webプロセスが起動後60秒以内に$PORTにバインドできなかった)。
-
[解決済み] nodeファイルの先頭にある"/usr/bin/env node "は、具体的には何をするのですか?
-
[解決済み] E: npm パッケージを見つけることができません。
-
[解決済み] NodeJsのSequelizeでautoIncrementはどのように動作するのですか?
-
[解決済み] Mongoose Schema がモデルとして登録されていません。
-
[解決済み】NodeJS / Express: "app.use "とは何ですか?