2012-11-27 41 views
1

我需要插槽和快速JS之间共享会话。 我试图使这个例子工作:http://www.danielbaulig.de/socket-ioexpress/没有成功。网页浏览器返回的Node.js(快递JS 3.X与Socket.io一起)

GET localhost:8000/socket.io/1/?t=1354005884872 500 (Internal Server Error)

会话开始。我得到的服务器端错误:

warn - handshake error Error

服务器端脚本:

var express = require('express') 
    , util = require('util') 
    , connect = require('express/node_modules/connect') 
    , parseCookie = connect.utils.parseCookie 
    , MemoryStore = connect.middleware.session.MemoryStore 
    , store; 

    var app = express() 
    , http = require('http') 
    , server = http.createServer(app) 
    , io = require('socket.io').listen(server); 

    var connect = require('express/node_modules/connect') 
    , util = require('util') 
    , cookie = require('cookie') 
    , parseCookie = cookie.parse 
    , MemoryStore = connect.middleware.session.MemoryStore 
    , store; 

app.configure(function() { 
    app.use(express.cookieParser()); 
    app.use(express.session({ 
     secret: 'secret' 
    , key: 'express.sid' 
    , store: store = new MemoryStore() 
    })); 
    app.use(function (req, res) { 
     res.send('Hello, your session id is ' + req.sessionID); 
    }); 
}); 

io.set('authorization', function (data, accept) { 
    if (!data.headers.cookie) 
    return accept('No cookie transmitted.', false); 

    data.cookie = parseCookie(data.headers.cookie); 
    data.sessionID = data.cookie['express.sid']; 

    store.load(data.sessionID, function (err, session) { 
    if (err || !session) return accept('Error', false); 

    data.session = session; 
    return accept(null, true); 
    }); 
}).sockets.on('connection', function (socket) { 
    var sess = socket.handshake.session; 
    socket.log.info(
     'a socket with sessionID' 
    , socket.handshake.sessionID 
    , 'connected' 
); 
    socket.on('set value', function (val) { 
    sess.reload(function() { 
     sess.value = val; 
     sess.touch().save(); 
    }); 
    }); 
}); 

app.use(count); 

// custom middleware 
function count(req, res) { 
    req.session.count = req.session.count || 0; 
    var n = req.session.count++; 
    res.send('viewed ' + n + ' times\n'); 
} 

server.listen(8000); 

客户端脚本:

<%= javascript_include_tag "http://localhost:8000/socket.io/socket.io.js" %> 
var socket = io.connect('http://localhost:8000'); 

socket.io v0.9.11,express.js V3 .0.3,连接V2.7.0,饼干v0.0.5

我希望你能帮助我。

+1

的可能重复[http://stackoverflow.com/questions/12801027/since-connect-doesnt-use-the-parsecookie-method-anymore-how-can-we-get-session](http:// stackoverflow.com/questions/12801027/since-connect-doesnt-use-the-parsecookie-method-anymore-how-can-we-get-session) – zemirco

回答

0

在一个项目可能有助于简化一切都是为了你刚刚来到。 Express.io结合了express和socket.io,并包含一堆易于获取的工作示例: https://github.com/techpines/express.io

我只用它玩了一下自己,但它看起来很有希望。希望这可以帮助。