2017-01-16 45 views
0

当项目有两个或多个实例时,我的bluemix应用程序出现问题。Bluemix Node.js在多个实例中使用会话

如果我只保留一个实例的项目,这段代码按预期工作,当调用url'/ load'时,我接收保存在'/ save'中的数据。但是,当我在应用程序中放置更多的实例时,'/ load'最多时候不会发送任何内容。

它像会话保存在项目的一个实例中,当用户点击另一个url时,'/ load'正在另一个实例中执行。

那么,有没有人知道如何确保用户只使用一个实例或在实例之间共享会话值?

var express = require('express'); 
var session = require('express-session'); 
var cfenv = require('cfenv'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 

var app = express(); 



app.use(express.static(__dirname + '/public')); 

app.use(cookieParser()); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ 
    extended: false 
})); 

app.use(session({ 
    resave: 'false', 
    saveUninitialized: 'true', 
    secret: 'cub1ksqu4d_mysp0t' 
})); 

var appEnv = cfenv.getAppEnv(); 

app.get("/save", function (req, res) { 
    req.session.fullname = "John Galt"; 
    res.send("Saved session"); 
}); 

app.get("/load", function (req, res) { 
    res.send(req.session.fullname); 
}); 

app.listen(appEnv.port, '0.0.0.0', function() { 
    console.log("server starting on " + appEnv.url); 
}); 

回答

0

您应该将您的应用设计为无状态过程。这实际上是12 factors之一(参见12 factor app)。

如果要共享应用程序之间以及应用程序实例之间的状态,通常的做法是使用数据库来存储该数据。有框架允许跨实例缓存数据/状态。

0

似乎每个实例也都有自己的请求管理器,它不是共享的,每个请求是通过所有实例平衡。

你可以让/ save获取一个名称参数并测试以不同名称执行/保存几次,然后/加载以查看它是否随机返回给定的不同名称。

如果你想通过多个实例共享信息,我会建议在你的应用上使用数据库服务。

相关问题