[解決済み] Expressのパラメータ "next "は何に使うのですか?
2022-03-15 13:07:05
質問
次のような簡単なコードのブロックがあるとします。
app.get('/', function(req, res){
res.send('Hello World');
});
この関数は2つのパラメータを持っています。
req
と
res
であり,それぞれリクエストオブジェクトとレスポンスオブジェクトを表しています.
一方、第3パラメータに
next
. 例えば、次のようなコードを見てみましょう。
app.get('/users/:id?', function(req, res, next){ // Why do we need next?
var id = req.params.id;
if (id) {
// do something
} else {
next(); // What is this doing?
}
});
の意味がわからない。
next()
は、なぜ使用されているのでしょうか?この例では、idが存在しない場合、何が
next
実際に何をしているのか?
どのように解決するのか?
次の
マッチング
のルートがあります。たとえば、あなたがあげた例では、もし
id
が指定され、それを
req.user
.
以下、こんなルートができます。
app.get('/users', function(req, res) {
// check for and maybe do something with req.user
});
/users/123 はあなたの例のルートに最初にマッチするので、まず最初にユーザーをチェックし、見つけます。
123
次に
/users
はその結果で何かをすることができます。
ルートミドルウェア
は、特定のURIスキームやルートの順序に依存しないので、より柔軟で強力なツールだと私は思いますけどね。 私は、このように示された例をモデル化したいと思います。
Users
モデルで、非同期
findOne()
:
function loadUser(req, res, next) {
if (req.params.userId) {
Users.findOne({ id: req.params.userId }, function(err, user) {
if (err) {
next(new Error("Couldn't find user: " + err));
return;
}
req.user = user;
next();
});
} else {
next();
}
}
// ...
app.get('/user/:userId', loadUser, function(req, res) {
// do something with req.user
});
app.get('/users/:userId?', loadUser, function(req, res) {
// if req.user was set, it's because userId was specified (and we found the user).
});
// Pretend there's a "loadItem()" which operates similarly, but with itemId.
app.get('/item/:itemId/addTo/:userId', loadItem, loadUser, function(req, res) {
req.user.items.append(req.item.name);
});
このようにフローをコントロールできるのは、かなり便利です。特定のページは、管理者フラグを立てたユーザーしか利用できないようにすることもできます。
/**
* Only allows the page to be accessed if the user is an admin.
* Requires use of `loadUser` middleware.
*/
function requireAdmin(req, res, next) {
if (!req.user || !req.user.admin) {
next(new Error("Permission denied."));
return;
}
next();
}
app.get('/top/secret', loadUser, requireAdmin, function(req, res) {
res.send('blahblahblah');
});
この記事から何かインスピレーションを得られたでしょうか?
関連
-
[解決済み] MongoDB でコレクションを日付順に並べるには?
-
[解決済み] nodejsでfindAllのソート順を続編にする
-
[解決済み] Yarn にパッケージを強制的に再インストールさせるにはどうしたらいいですか?
-
[解決済み] "致命的なエラーです。grunt "コマンドを実行すると、"Unable to find local grunt. "と表示されます。
-
[解決済み] npm installの-saveオプションは何ですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.jsのConnect、Express、「ミドルウェア」って何?
-
[解決済み] Expressで"? "の後にあるGETパラメータにアクセスするにはどうすればよいですか?
-
[解決済み】Expressで完全なURLを取得する方法は?
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラーです。EACCES: 権限が拒否されました、アクセス '/usr/local/lib/node_modules' 。
-
[解決済み】nodemon - app crashed - waiting for file changes before start
-
[解決済み】Passport.js - エラー: ユーザーのセッションへのシリアライズに失敗しました。
-
[解決済み] MongoDB でコレクションを日付順に並べるには?
-
[解決済み] Node.jsのホスト名/IPが証明書のaltnamesと一致しない
-
[解決済み] ブラウザで動作しているURLで「connect ETIMEDOUT」エラーが発生する原因は何ですか?
-
[解決済み] バルク更新を行う。
-
[解決済み] エラーです。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりません。
-
[解決済み] エラー: ノード出力を "|head" にパイプするときに EPIPE を書き込む。
-
[解決済み] npm not able to find a fileに関連するエラーは何が原因でしょうか?node_modules サブフォルダ内にコンテンツがありません。なぜでしょうか?