2017-04-07 5 views
0

Node.jsでExpressを使用していて、リフレッシュ動作についてかなり混乱しています。 /testをリフレッシュすると、配列の長さが0でないため、app.useにヒットしたときに何かがサーバー側にキャッシュされているように見えます(下記のサンプルコードを参照)。私は/test私は再びブラウザをリフレッシュしている打撃しているので、私は配列の長さをゼロにリセットすると期待します。Expressアプリケーションのリフレッシュ動作

デフォルトでは、app.useにキャッシュされますか? Expressミドルウェアは、リフレッシュの面でどのように機能しますか? Express 4.14のドキュメントでこれを明確に説明したものは何も見つかりませんでした。

==================

ブラウザエンドポイント:localhost:8000/test

クライアント:

$.get('/data').done(function(response){...} 

ルート:

module.exports = function(app) { 
    app.get('/test', function(req,res) { 
    var arr =[]; 
    app.use('/data', function(req,res, next) { 
     console.log(arr.length); // this is nonzero on refresh 
     arr.push(/* some stuff*/); 
     res.send({"arr": arr}); 
    } 
    res.render('test.html') 
    } 
} 

サーバー:

var express = require('express'); 
var app = express(); 

require('./routes/route')(app); 
app.set('views',__dirname + '/views'); 
app.set('view engine', 'ejs'); 
app.engine('html', require('ejs').renderFile); 

var server = app.listen(8000, function() { 
    console.log("server started 8000"); 
}); 
app.use(express.static(__dirname + '/public')); 
+1

Expressミドルウェアは、すべての要求ではなく、アプリケーションの開始時に1回だけ定義する必要があります。 – robertklep

答えて

1

実際にはサーバーのキャッシュではありません。これは、クロージャー内にミドルウェアを登録しているために、そのクロージャー変数(arrなど)がミドルウェアの次の呼び出しのために保持されるためです。さらに、ミドルウェアを何度も登録しています(/testがヒットするたびに新しいもの)。

あなたが/testルートを打つたびに、あなたが他の重複app.use()ハンドラを追加することを意味しますapp.get()内部app.use()登録

。それらは時間とともに累積され、同一のミドルウェアは同じ要求に対して複数回実行され、最初に登録されていたときから以前の値である arrを保持しますが、それぞれがその配列に独自の値を持ちます。

app.use()app.get()の中に登録しないでください。ハンドラが1つだけ必要であるため、それらを蓄積したくないからです。


app.use('/data/, ...)ミドルウェアで達成しようとしていることは不明です。あなたの現在の構造が間違っていることは明らかですが、あなたが何をしようとしているのかを理解していないと、それをどのように書くべきかがはっきりしていません。ミドルウェアの通常の機能は、サーバの初期化中に一度だけ登録され、要求ハンドラ内に登録されることはありません。


あなたのAJAX呼び出しに対応しようとしている場合:

$.get('/data').done(function(response){...} 

その後、あなたはあなたのappモジュールのトップレベルでapp.get('/data', ...)は、その仕事をしたいでしょう。


arr.push()は、私たちはこれ以上詳細に支援するために達成することになっているかを説明してください。

+0

@Bethany - これはあなたの質問に答えましたか?その場合は、回答の左側にある緑色のチェックマークをクリックすることでコミュニティに示すことができます。また、適切な手順に従うことで評判のポイントを得ることもできます。 – jfriend00

+0

徹底的な対応に感謝します!私は表現/ミドルウェアがどのように動作するのかよく知らないので、トップレベルに置くべきであることを知っておいてください。 実際にはこのコードの機能を維持したいと思っています(リフレッシュ時には、配列を消去したくありません)。私はそれを達成するためにセッションなどを調べます。再度、感謝します! – Bethany

+1

@Bethany - はい、ユーザーセッションオブジェクトを作成し、そのユーザー固有のセッションに配列を配置することは、後になっているように見えます。 – jfriend00

関連する問題