Trong một dự án hiện tại (loại một hệ thống cửa hàng), tôi sử dụng Node.js với expressJS và kết nối-Mongo như cửa hàng phiên. Về phía máy khách, tôi sử dụng một yêu cầu duy nhất lúc khởi động để tạo một phiên mới và gửi nhiều yêu cầu song song đến máy chủ node.js sau đó. Vì các yêu cầu song song này thay đổi phiên, những thay đổi đó dường như ghi đè lên nhau, mặc dù chúng thay đổi các đối tượng khác nhau của phiên, tất nhiên.yêu cầu song song với Node.js, kết nối-Mông Cổ, phiên ghi đè
Ví dụ (tất cả 3 yêu cầu bắt đầu cùng một lúc):
- Request Một đẩy một số sản phẩm đến các mảng
req.session.productHist['abc']
- Yêu cầu B đẩy sản phẩm để
req.session.productHist['def']
- Yêu cầu C mất một thời gian, nhưng không thay đổi phiên
Vì yêu cầu C hoàn tất sau khi yêu cầu A và B, nhưng bắt đầu trước khi kết thúc, có vẻ như ghi đè session.productHist
với giá trị được giữ khi yêu cầu C bắt đầu (null).
Làm cách nào để khắc phục sự cố này?
Cập nhật:
Một số mã ví dụ với giao diện điều khiển đầu ra: log
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);
Console:
máy chủ bắt đầu tại địa chỉ: Thu, 15 Tháng mười hai 2011 15:50:37 GMT
################### newSession
#################### init bắt đầu
################### sản phẩm -1 bắt đầusản phẩm: session.productHist: {"-1": [{"id": "Thu, 15 Dec 2011 15:50:40 GMT"}, {"id": "Thu, 15 Dec 2011 15:50:40 giờ "}]}
################### sản phẩm -1 cuối### ################ init end
init: session.productHist: {}
sản phẩm ################### -1 bắt đầu
[...]
sản phẩm: session.productHist: { "-1": [{ "id": "Thu, 15 Dec 2011 15:50:53 GMT"}, {"id": "Thu, 15 Dec 2011 15:50:53 GMT"}]}
####### ############ products -1 end
Không thể yêu cầu C xảy ra sau khi A & B? – alessioalex
Tôi muốn có thể gửi các yêu cầu song song nếu có thể. tôi có thể gửi A & B sau khi C hoàn thành, nhưng điều đó sẽ làm chậm trải nghiệm người dùng – jb90
Yêu cầu C làm gì ..? – alessioalex