Bluemix Node.js在多个实例中使用会话

时间:2017-01-16 14:17:28

标签: node.js express ibm-cloud express-session

当项目有两个或更多实例时,我的bluemix应用程序出了问题。

如果我只使用一个实例保留项目,则此代码按预期工作,并且当url' / load'被叫,我收到保存在' / save'中的数据。但是,当我在应用程序中添加更多实例时,' / load'大多数时候都不发送任何内容。

就像会话保存在项目的一个实例中一样,当用户点击另一个网址时,' / 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);
});

2 个答案:

答案 0 :(得分:0)

似乎每个实例都有自己的请求管理器,并且它没有共享,每个请求都通过所有实例进行平衡。

你可以让/ save取一个名字参数并测试用不同的名字执行/保存几次然后用/ load看它是否“随机”返回给出的不同名字。

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

答案 1 :(得分:0)

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

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