2017-01-16 41 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獲取一個名稱參數並測試以不同名稱執行/保存幾次,然後/加載以查看它是否隨機返回給定的不同名稱。

如果你想通過多個實例共享信息,我會建議在你的應用上使用數據庫服務。

相關問題