如何在bluemix

时间:2017-12-04 21:29:16

标签: node.js socket.io ibm-cloud cloudfoundry

我需要在IBM Bluemix上部署一个带有多个cloudfoundry实例的socket.io应用程序,以确保负载平衡。

我遵循了socket.io文档和这个link来使用粘性会话,并确保每个套接字都转到正确的实例。

不幸的是,我的客户端在连接事件和错误' 400 xhr poll'之后断开连接。错误被解雇了。

这是我的服务器代码:

const cookieParser = require('cookie-parser')
const session = require('express-session')
const redis = require('redis')
const app = require('express')()
const http = require('http').Server(app)
const io = require('socket.io')(http)
const RedisStore = require('connect-redis')(session)
const redisUrl = 'myredis'

var session = session({
  store: new RedisStore({client: client}),
  secret: 'mysecret',
  name: 'jsessionid',
  resave: true,
  saveUninitialized: true
})

app.use(cookieParser)
app.use(session)

io.on('connection', function (socket) {
  console.log('a user is connected')

  socket.on('testPing', function () {
      socket.emit('testPong', {})
  })
})


http.listen(process.env.PORT || 3000, function () {
  console.log('listening on *:' + (process.env.PORT || 3000))
})
经过几个小时在谷歌搜索后,我不知道该怎么办了。我真的需要一些帮助。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

您使用的是小写jsessionid。尝试大写它。会议文档在这里:https://docs.cloudfoundry.org/concepts/http-routing.html#sessions

答案 1 :(得分:0)

我最近这样做(虽然没有Redis),以解决同样的问题; socket.io和负载均衡器不能在开箱即用的情况下很好地协同工作。关键是使用JSESSIONID cookie来实现会话亲和性。这是我的代码:

const expressSession = require('express-session');

...

var app = express();

...

app.use(
    expressSession({
      key: 'JSESSIONID', // use a sticky session to make sockets work
      secret: 'arbitrary-secret',
      cookie: {
         maxAge: 24 * 60 * 60 * 1000, // 1 day
         secure: false
      },
      saveUninitialized: false,
      resave: false
   })
);
//setting up socket.io for realtime communication
var http = require('http').Server(app);
var io = require('socket.io')(http);