を上書きし、Iは接続-MongoのをセッションストアとしてexpressJSとのNode.jsを使用して。クライアント側では、起動時に1つのリクエストを使用して新しいセッションを作成し、その後に複数のパラレルリクエストをnode.jsサーバーに送信します。 これらの並列要求はセッションを変更するため、セッションの異なるオブジェクトを変更するものの、それらの変更は互いに上書きされているように見えます。平行要求、接続-モンゴを、セッションが現在のプロジェクト(店舗システムの一種)で
例(すべての3つの要求を同時に開始):
- 要求A配列にいくつかの製品をプッシュ
req.session.productHist['abc']
- リクエストBがCは、いくつかの時間がかかる
req.session.productHist['def']
- 要求に製品を押す、しかしセッションを変更しない
要求CはリクエストAとBの後に終了するが、終了する前に開始するため、を上書きしているように見えるは、要求Cが開始されたときに保持されていた値(null)で保持されます。
どうすればこの問題を解決できますか?
更新:
コンソール出力を持ついくつかのサンプルコード:
var url = require('url'),
express = require('express'),
MongoStore = require('connect-mongo');
var aDay = 24*60*60*1000;
var app = express.createServer();
app.configure(function(){
app.use(express.cookieParser());
app.use(express.session({
secret: "secret",
store: new MongoStore({ db: 'lmsCache' }),
maxAge: aDay
})
);
app.use(express.methodOverride()); app.use(express.bodyParser());
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
app.use(app.router);
app.use(express.logger());
});
function sendStringified(req, res, data) {
data = JSON.stringify(data);
if (req.url_query.callback) { data = req.url_query.callback + "(" + data + ");"; }
res.send(data);
}
function parseParams(req,res,next) {
req.url_query = url.parse(req.url,true).query;
next();
}
function doExpensiveStuff(req,res,next) {
console.log("######################### init start");
[...]
}
app.get('/init', parseParams, doExpensiveStuff, function(req,res) {
console.log("init: session.productHist: " + JSON.stringify(req.session.productHist));
console.log("######################### init end");
sendStringified(req,res,null);
});
app.get('/products', parseParams, function(req,res) {
console.log("######################### products "+req.url_query.category+" start");
if(!req.session.productHist[req.url_query.category])
req.session.productHist[req.url_query.category] = [];
for(var i=0;i<2;i++) {
req.session.productHist[req.url_query.category].push({ "id": new Date().toGMTString() });
}
console.log("products: session.productHist: " + JSON.stringify(req.session.productHist));
console.log("######################### products "+req.url_query.category+" end");
sendStringified(req,res,[]);
});
app.get('/newSession', parseParams, function(req,res) {
console.log("######################### newSession");
req.session.productHist = {};
sendStringified(req,res,true);
});
app.listen(8080);
time = new Date().toGMTString();
console.log('Server starting at: ' + time);
コンソールログ:
Serverはから始まる:木、2011年午後03時50分37秒GMT 12月15日
########### newSession
########### init start
###########製品-1開始製品:session.productHist:{"-1":[{"id": "2011年12月15日15:50:40 GMT"}、{"id": "Thu、15 Dec 2011 15:50:40 GMT "}]}
###################製品-1端### ########## init end
INIT:session.productHist:{}
###################製品は
[...]
製品を開始-1:session.productHistを:{ "-1":[{ "id": "Thu、2011年12月15日15:50:53 GMT"}、{"id": "2011年12月15日15:50:15 GMT"}}}
######## ####### ########## products -1 end
AとBの後にCを要求できません。 – alessioalex
可能であれば、パラレルリクエストをどこかで送信できるようにしたいと考えています。私はCが終了した後にA&Bを送信することができますが、それはユーザーエクスペリエンスを遅くします – jb90
リクエストCはどうにもなりません.. – alessioalex