В текущем проекте (вид системы магазина), я использую Node.js с expressJS и соединить-Монго в качестве сессионного магазина. На стороне клиента я использую один запрос при запуске для создания нового сеанса и отправки нескольких параллельных запросов на сервер node.js. Поскольку эти параллельные запросы меняют сеанс, эти изменения, похоже, переписывают друг друга, хотя, конечно, они меняют разные объекты сеанса.параллельные запросы к Node.js, подключение-Mongo, сессия перезаписаны
Пример (все 3 запроса начинаются в то же время):
- Запрос толкает некоторые продукты в массив
req.session.productHist['abc']
- Заявка В выталкивает продукты к
req.session.productHist['def']
- Request C занимает некоторое время, но не меняет сеанса
Поскольку запрос C заканчивается после запроса A и B, но начинается до их завершения, он, кажется, перезаписывает session.productHist
со значением, которое оно удерживало при запуске запроса C (null).
Как это исправить?
Update:
Некоторые примеры кода с выходом консоли:
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);
консоли журнала:
сервера, начиная с: Чт, 15 дек 2011 15:50:37 GMT
################### newSession
################### INIT начать
################### продукты -1 начатьпродукты: session.productHist: {"-1": [{"id": "Thu, 15 Dec 2011 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, 15 Dec 2011 15:50:53 GMT»}, {«id»: «Thu, 15 Dec 2011 15:50:53 GMT»}]}
####### ############ products -1 end
Невозможно запросить C после A & B? – alessioalex
Я хотел бы иметь возможность отправлять параллельные запросы, если это возможно. я мог бы отправить A & B после завершения C, но это замедлит работу пользователя. – jb90
Что делает запрос C в любом случае ..? – alessioalex