2016-05-05 6 views
0

に答えたです:Nodejsエクスプレス不要な行動:コード二つの異なるHTTPリクエストを取得は、ユニークな答えここ

FILE: server.js 
var express = require('express'), 
    app = express(), 
    useragent = require('express-useragent'), 
    compression = require('compression'), 
    vhost = require('vhost'); 

app.use(vhost("blabla.com", 'app.js')); 
app.disable('x-powered-by'); 
app.use(compression()); 
app.use(useragent.express()); 
app.listen(80); 

FILE app.js 
var useragent = require('express-useragent'), 
     express = require('express'), 
     sessao = require('express-session'), 
     armazenamento_ficheiros = require('session-file-store')(sessao), 
     compression = require('compression'), 
     app = express(), 
     favicon = require('serve-favicon'); 

global.uuid = require('uuid'); 

app.all('/u/my.json', function (req, res) { 
    var body = ''; 
    p.on('data', function (d) { 
     body += d; 
    }); 
    p.on('end', function() { 
     var g = require('./gateway'); 
     g.e(body,res); 
    }, 'utf-8'); 
}); 

module.exports = app; 

FILE:gateway.js 
module.exports = { 
    e: function (body,res) { 
    //connects to database using data in body and send results to client.... 
    res.header("Cache-Control", "no-cache, no-store, must-revalidate"); 
    res.header("Pragma", "no-cache"); 
    res.header("Expires", 0); 
    res.header('Last-Modified', (new Date()).toUTCString()); 
    res.header("Content-type", "application/json; charset=utf-8"); 
    res.send(JSON.stringify({"a":1})); 
    } 
}; 

問題は時々、クライアントは、2つのHTTP要求を行い、ランダムに、両方の中で答えていることです対応する応答を取得する各HTTP要求の代わりにユニークな応答を返します。この問題は、http要求の1つがデータベースに要求を出して(応答を取得するのに遅れを生む)、別の要求で応答されたように見えます。ヘッダーを送信するので、エラーが発生します。
私はgateway.jsファイルがロードされ、各HTTPリクエストで実行されていることを確認しますが、なぜそれらが混ざっているのか分かりません。私のコードで何が間違っていますか?どんな助けでも感謝します。ありがとうございました。

+0

'global.make_reply'関数では、' r'のヘッダを設定しているので、 'r'は' response'オブジェクトであると仮定しましたが、 'r.send(r ) '。これはつまり、あなたが実際に '' {"a":1} "を実行していることを意味する' global.make_reply(JSON.stringify({"a":1})) ")'。 –

+0

私はサンプルコードを編集しました。 vhostを使って作業するには、新しいアプリケーションを読み込むことを提案しました(エクスプレスを含む)。 – user1774309

+0

2つの別々のポートでリッスンしている2つのサーバーを実行している場合を除き、このコンテキストで「vhostを使用する」とは何を意味するのか、なぜ2つの 'app'オブジェクトを作成するのかはわかりません。 – jfriend00

答えて

0

非同期コードを使用する場合、グローバル変数に一意の関数を割り当てて、正しい非同期操作がグローバルから正しいユニーク関数を取得することは期待できません。あなたのコードは同期的に実行されないので、共有変数に何かを入れておかないと、適切なことが適切なタイミングでそこにあり、上書きされていないことを知ることができます。それは決して信頼できない悪いデザインです。

Expressアーキテクチャのサーバーでは、要求ごとに一意のrequestオブジェクトとresponseオブジェクトが作成され、少なくとも応答オブジェクトは通常、応答が完了するまで(応答が必要なので)渡されます。この特定の要求に固有のデータを格納する場所が必要な場合は、responseまたはrequestオブジェクトに独自のカスタムプロパティを追加することで、非同期操作のためにオーバーラップする時間枠で実行される2つの要求が発生することを回避できます他の州。

あなたのコードに完全に従っているわけではありませんが、responseオブジェクトを渡しているように見えるので、応答オブジェクトに一意の関数を置き、そこから呼び出すことができます。しかし、毎回新しい関数を作成するのではなく、独自のデータをレスポンスオブジェクトとともに渡す方が良いでしょう。

その他の問題は、私が参照してください。

  1. あなたが複数回var app = express();を行うことによって、複数のappオブジェクトを作成しています。それはまれに正しい実装です。通常はappオブジェクトを1つだけ作成し、それはapp.listen(80)を呼び出すものである必要があります。

  2. あなたの一文字の変数名は、コードをすぐに理解するためのコードを知らない人にとって、コードをもっと難しくします。わかりやすい変数名を使用してください。これは、数バイトを節約しようとする場所ではありません。

  3. global.make_reply()の最初の引数は何ですか?その関数を定義すると、.header().send()メソッドを持つ応答オブジェクトのように見えます。しかし、gateway.jsで呼び出すと、その最初の引数として文字列を渡します。あなたがコードを書いたように、これがどのように機能するかわかりません。

+0

vhostのために複数のアプリが別々に動作しますが、多分私は間違っています。私はヘルパーの助けになるようにサンプルコードを編集しました。これは、私が間違っていることを理解しなければならないコードの要約の一種です。ありがとうございます – user1774309

+0

@ user1774309 - わかりません。あなたはあなたの質問の実装を変更しました(今はまったく異なる質問ですが)、今あなたが何を求めようとしているのか分かりません。一般的には、あなたが行ったように、あなたの質問にあなたの実装を変更すべきではありません。なぜなら、既存のすべての議論を後で来る人に完全に混乱させるからです。ただし、何かを明確にするために、新しいコンテンツを質問に追加することができます。 – jfriend00

+0

が分かります。ごめんなさい。 – user1774309

関連する問題