1. ホーム
  2. node.js

[解決済み] Expressのパラメータ "next "は何に使うのですか?

2022-03-15 13:07:05

質問

次のような簡単なコードのブロックがあるとします。

app.get('/', function(req, res){
    res.send('Hello World');
});

この関数は2つのパラメータを持っています。 reqres であり,それぞれリクエストオブジェクトとレスポンスオブジェクトを表しています.

一方、第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');
});

この記事から何かインスピレーションを得られたでしょうか?