2016-09-20 5 views
0

私はアプリケーションを作成しており、それを開発するためにhttp://c9.io環境を使用しています。これはNodeJSアプリケーションで、クライアントサイドアプリケーションが照会するためのいくつかのRESTエンドポイントを提供します。これまではすべて正常に動作していましたが、今日私が観察していることは、ブラウザからREST APIに送信された1回のコールに対して、2つのリクエストが受信されて表示され、リクエストハンドラが2回コールされていることです。これにより、1つの要求に対する応答時間が遅くなりました。1つだけのメッセージを送信したときにサーバー上で2つのHTTPリクエストを受信

Chromeデベロッパーツールでは、送信されたリクエストは1つのみ表示されますが、app.use()を使用してExpressで受信リクエストを記録し、リクエストごとに同じリクエストを2回印刷します。また、ハンドラは2回呼び出されます。

これは断続的に起こっているのではなく、毎回です。 私は企業ネットワークの後ろにいます。私がテストのためにその日にたくさんのリクエストを送ったので、それが疑わしいと思ってから監視プログラムがリクエストを送信する可能性はありますか?私は要求を処理するコードを編集していません。

編集:提案されているようにハンドラのコードを追加する。

app.get('/suggestions/:keyword', function(r, s) { 
    sug_db.retrieveSuggestions(r.params.keyword, function(data) { 
     s.writeHead(200, {'content-type': 'text/html'}); 
     s.write(renderSugg({data: data})) 
     s.end(); 
    }); 
}); 

app.get('/search/:query', function(r, s) { 
    esc_db.search(r.params.query, function(data) { 
     s.send(renderResults({query: r.params.query, results:data})); 
    }); 
}); 

ご覧のとおり、データベースからデータを取得してその結果をHTTP応答として返します。私が使用しているテンプレートエンジンはPug(旧翡翠)です。

+0

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests –

+0

これはCORSコールではありません。また、ブラウザから送信された場合は、インスペクタの右に表示されますか? –

+0

@aditya_mはい、インスペクタにCORSリクエストが表示されます。また、おそらく同じハンドラで処理されないOPTION要求になります。あなたのハンドラコードを見ずに何も言わないのは難しいです。 – rsp

答えて

1

質問に含まれているコードが2度実行されているように見えることはありません。しかし、おそらくsug_db.retrieveSuggestionsまたはesc_db.searchのコードがあります。私はどうなるのか

はこれです:

app.get('/suggestions/:keyword', function(r, s) { 
    console.log('*** GET /suggestions/:keyword handler'); 
    sug_db.retrieveSuggestions(r.params.keyword, function(data) { 
     console.log('GET /suggestions/:keyword callback'); 
     s.writeHead(200, {'content-type': 'text/html'}); 
     s.write(renderSugg({data: data})) 
     s.end(); 
    }); 
}); 

app.get('/search/:query', function(r, s) { 
    console.log('*** GET /search/:query handler'); 
    esc_db.search(r.params.query, function(data) { 
     console.log('GET /search/:query callback'); 
     s.send(renderResults({query: r.params.query, results:data})); 
    }); 
}); 

(またはのどんな方法にconsole.logを変更します。

あなたは関数を呼び出す前に、コールバックの内側の両方、提供されたコード内のいくつかのログを追加します。あなたが使用するログ)。 実際に何が2回呼び出されるかは、ハンドラ自体、コールバック、または何も表示されません。次は、実際にハンドラによって呼び出される関数の検査のようになります。

  • sug_db.retrieveSuggestions()
  • esc_db.search()
  • renderSugg()
  • renderResults()

それは実際には2回呼び出されたかを確認することが重要だとなぜそれが起こっているのかを調べます。

function badFunction(data, callback) { 
    if (something) { 
    callback('error'); 
    } 
    callback('ok'); 
} 

の代わり:

function goodFunction(data, callback) { 
    if (something) { 
    callback('error'); 
    } else { 
    callback('ok'); 
    } 
} 

私はハンドラから呼び出される関数を呼び出すためにそのような何かを行うことができることを期待しかし、それは例えば、あなたのような何かを、場合に発生することができますコールバックが2回発生している可能性があります。また、以前チェックした条件やエラーが発生していない可能性があります。

+0

はい、リクエストハンドラ自体に 'console.log'を追加し、それらは2回呼び出されています。しかし、ポイントは、すべてのリクエストを記録するために使用している 'app.use()'ミドルウェアでさえ、2つのリクエストを示しているということです。このコードの前に実行されているので、制御がこのコードの権利に達する前に問題がどこかに早すぎますか? –

+0

@aditya_m右。このコードに達する前に、それは何かのようです。たぶん2つのネットワーク要求が送信されている可能性があります。または、ログが2回実行されている可能性があります。言うのが難しい。実際には、あなたのコードにたくさんのconsole.log行を追加したり、tcpdumpなどを使ってリクエストがネットワーク上にあるのか、あなたのアプリだけにあるのかを知ること以外はアドバイスできません。これらのエンドポイントの両方に何らかのテストデータを常に返すシンプルなモックアップアプリケーションを作成し、それが2回実行されるかどうかを確認することもできます。非常に奇妙な問題。 – rsp

+0

この問題の本質とその発生パターン(多くのリクエストが正常に実行された後、1日の終わりに発生)は、重複要求を送信してサーバーをチェックしている監視ソフトウェアの方に私を指摘しています。 (私が言ったように、私は高度に保護された企業ネットワークの背後にある)。クライアントのIPアドレスを取得し、それを記録して、他の要求がどのシステムから来ているかを確認します。それは確かに手がかりを与えるでしょう。何かを見つけたらこのスレッドを更新します... –

関連する問題