0

ルートからリクエスト パラメータを取得しています。たとえばmydomain.com/topic/animals、 whererequestParam = req.params.topicNameとこの場合はanimals.

考えられるすべてのトピックを含むオブジェクトをループし、topicNameに一致する が見つかった場合requestParamは、データベースへの呼び出しを実行して、そのトピックのすべてのコレクションを返します。

問題は、常にelse句を実行するため、同期的に実行されていることです。

if (requestParam === topicName) {
  // fetch submission
} else {
  // return 404
}

したがって、常に 404 が返されますがelse、ここで句を取り除けば機能します。アンダースコアを調べまし_.after()たが、適切に機能させることができませんでした (そして、それが私が使用すべきものであるかどうかさえわかりませんか?

私のコード:

_.each(topics, function(key, topic) {
  var topicName = key['topicName'],

  if (requestParam === topicName) {
    Submission.getTopicSubmissions({ topicName : topicName }, function(err, submissions) {
      if (err) {
        res.redirect('/');
      } else if (submissions) {
        res.render('topic', {
          submissions: submissions
        });
      } else {
        res.redirect('/topics');
      }
    });
  } else {
    res.render('errors/404', {
      title: 'Page Not Found -',
      status: 404,
      url: req.url
    });
  }
});
4

1 に答える 1

0

問題は、各反復内で 404 をレンダリングしないことです。非同期ルックアップを行うため、現在の関数が進行している間、将来のある時点で実行されるようにスケジュールされています。間違いなく、ある時点で別のものに遭遇し、少なくとも 1 回は 404 をレンダリングすることになります。次のように、壊れやすい反復を使用し、検索時にマークを付け、反復の外で 404 を実行します。

var isWaitingForResult = false;
topics.every(function(topic, key) { // TODO: Check if this iterator matches _.each
    var topicName = key['topicName'],

    if (requestParam === topicName) {
      isWaitingForResult = true; // Wait for the result.
      Submission.getTopicSubmissions({ topicName : topicName }, function(err, submissions) {
        if (err) {
          res.redirect('/');
        } else if (submissions) {
          res.render('topic', {
            submissions: submissions
          });
        } else {
          res.redirect('/topics');
        }
      });
      return false; // stop iteration, we did start our search after all
    }
    return true; // continue iteration so we have another chance.
});
if (!isWaitingForResult) { // did a search NOT start?
    res.render('errors/404', {
      title: 'Page Not Found -',
      status: 404,
      url: req.url
    });
}

each to every を正しく書き直したかどうかわからないことに注意してください。これをチェックして。:)

于 2013-03-08T10:10:25.697 に答える