16

node.js を学習するために、mongoDB に保存されているいくつかの RSS フィードを取得し、それらを処理して、これらのフィードから単一のフィード (日付順) を作成する小さなアプリを作成しています。

約 1000 個のブログ アイテムを含む約 50 個の RSS フィードのリストを解析するため、全体を解析するには非常に長いため、req.connection.setTimeout(60*1000);すべてのフィードを取得して解析するのに十分な時間を確保するために、次のように記述します。

すべてが正常に実行されますが、リクエストが 2 回呼び出されます。(wiresharkで確認しましたが、ここではファビコンについてではないと思います)。

私は本当にそれを取得しません。

ここでテストできます: http://mighty-springs-9162.herokuapp.com/feed/mde/20 (「mde」に関する最新の 20 件の記事を含む RSS フィードを作成する必要があります)。

コードはこちら: https://github.com/xseignard/rss-unify

そして、興味深い部分に焦点を当てると:

私はこのように定義されたルートを持っています:app.get('/feed/:name/:size?', topics.getFeed);

は次のtopics.getFeedようになります。

function getFeed(req, res) {
  // 1 minute timeout to get enough time for the request to be processed
  req.connection.setTimeout(60*1000);   

  var name = req.params.name;
  var callback = function(err, topic) {
  // if the topic has been found
  if (topic) {
    // aggregate the corresponding feeds
    rssAggregator.aggregate(topic, function(err, rssFeed) {
      if (err) {
        res.status(500).send({error: 'Error while creating feed'});
      }
      else {
        res.send(rssFeed);
      }
    },
    req);
  }
  else {
    res.status(404).send({error: 'Topic not found'});
  }};
  // look for the topic in the db
  findTopicByName(name, callback);
}

特別なことは何もありませんが、それでも、この getFeed 関数は 2 回呼び出されます。

何が問題なのですか?何か案が?

4

12 に答える 12

10

これは長い間私を悩ませました。バックグラウンドで各 GET リクエストの複製を送信しているのは、おそらく Firebug 拡張機能です。Firebug をオフにして、それが問題でないことを確認してください。

于 2013-02-15T14:20:41.293 に答える
2

私は今、多かれ少なかれ同じことをしており、同じことに気づきました。

次のようにクロムにAPIアドレスを入力してサーバーをテストしています:

http://127.0.0.1:1337/links/1

私のNode.jsサーバーは、IDに応じてjsonオブジェクトで応答しています。

get メソッドでコンソール ログを設定したところ、Chrome のアドレス バーの ID を変更すると、(Enter キーを押して実際に要求を送信する前に) 要求が送信され、実際に Enter キーを押した後にサーバーが別の要求を受け入れることに気付きました。これは、chrome dev コンソールを開いている場合と開いていない場合に発生します。

IE 11 は同じように動作しないようですが、現在 Firefox をインストールしていません。

これが一種の古いスレッドであっても、誰かを助けることを願っています:)

/J

于 2015-04-02T19:30:34.893 に答える
1

タイムアウトをさらに増やす必要がある場合があります。エクスプレスソースは見ていませんが、タイムアウト時に鳴るだけで、再試行します。

于 2013-07-19T02:07:09.637 に答える
1

res.send(); を必ず指定してください。axios 呼び出しはサーバーからの値を期待するため、120 秒後に呼び出し要求を返します。

于 2018-12-06T04:41:10.703 に答える
0

私は同じ問題に遭遇しました。次に、リターンを追加しようとしましたが、うまくいきませんでした。しかし、 return res.redirect('/path'); を追加すると機能します。

于 2014-12-31T16:25:57.953 に答える