1

Express(v3)アプリがあり、(理想的なシナリオでは)ユーザーが入力フィールドに文字列を入力し、オートコンプリート関数が文字列に一致するリストを返すのを待って、そのリストから選択し、それによって「id」を追加します。隠しフィールドへの値。[実行]をクリックすると、リクエストはクエリを使用してこのエンドポイントにルーティングされます。

app.get('/predict', function(req, res) {

  // req.query should be something like
  // { name: "wat", id: 123 }

  res.render('predictions');
}

この機能を少し変更して、req.query.idが空の場合(つまり、ユーザーがオートコンプリートを待たなかった場合)、「オートコンプリートを待ってください」とリダイレクトする必要がないようにします。

私の考えでは、上記のエンドポイントを拡張して、次のようなことをしたいと思います

app.get('/predict', function(req, res) {

  // req.query is { name: 'wat', id: '' }

  if(req.query.id=='') {
    // then the user didn't wait for the autocomplete, so
    // guess the id ourselves
  } else {
    // ... some code
    res.render('predictions');
  }
}

自分でIDを推測する際に、オートコンプリート関数に使用するのと同じ外部APIを使用しています。このAPIは、クエリパラメーターに基づいて信頼値を含む結果の配列を返します。つまり、結果が希望どおりであると考える可能性があります。

次に、質問に移ります。このようなことはできますか?

app.get('/predict', function(req, res) {

  // req.query is { name: 'wat', id: '' }

  if (req.query.id=='') {

    makeRequestToAPIWithQuery(req.query.name, function(err, suggestions) {

      // suggestions[0] should contain my 'best match'
      var bestMatchName = suggestions[0].name;
      var bestMatchId   = suggestions[0].id;

      // I want to redirect back to *this* endpoint, but with different query parameters
      res.redirect('/predict?name='+bestMatchName+'&id='+bestMatchId);
    }
  } else {
    // some code
    res.render('predictions');
  }
}

req.query.idが空の場合、サーバーがサーバーに対して別の要求を行うようにします。したがって、リダイレクト後、req.query.idは空であってはならず、resは必要に応じて「予測」ビューをレンダリングします。

これは可能/賢明/安全ですか?私は何かが足りないのですか?

よろしくお願いします。

4

1 に答える 1

3

Expressルーターは、ミドルウェアとして複数のハンドラーを受け入れます。

最初のハンドラーにが存在するかどうかをテストし、idそれに応じてリクエストオブジェクトにデータを入力してから、元のハンドラーでは何も起こらなかったように実行できます。

function validatePredictForm(req, res, next) {
  if(!req.query.id) {
    req.query.id = 'there goes what your want the default value to be';
    return next();
  }
  else {
    // everything looks good
    return next();
  }
}

app.get('/predict', validatePredictForm, function(req, res) {

  // req.query should be something like
  // { name: "wat", id: 123 }

  res.render('predictions');
});
于 2013-03-05T17:23:22.407 に答える