2012-04-28 13 views
14

Tôi có ứng dụng web điển hình trong Nút đang sử dụng khung Express và phần mềm trung gian phiên. Tôi cũng đang sử dụng Socket.io cho một số phần năng động của ứng dụng của tôi (hiện tại, đây là một cơ chế trò chuyện, nhưng đó là tiếp tuyến). Tôi đã có thể thiết lập thành công phiên và socket.io một mình, nhưng muốn kết hợp chúng (EG: để kết hợp các tin nhắn trò chuyện socket với tài khoản người dùng mà không cần nhấn cơ sở dữ liệu). Cần lưu ý (và tôi có thể thấy đây là điểm có thể xảy ra), tôi đang chạy hai máy chủ tốc hành trên các cổng khác nhau: một cho lưu lượng HTTP thông thường và một cho lưu lượng HTTPS. Tuy nhiên, tôi đang có cả hai máy chủ trải qua một cấu hình idential và chia sẻ cùng một cửa hàng phiên. Phiên làm việc liên tục cho tôi giữa các trang http và https. Phiên đang được thiết lập ban đầu thông qua một trang được phục vụ từ HTTPS và trang socket.io là vani HTTP.Không thể nhận ID phiên Express từ cookie w/Socket.IO

Tôi đang làm theo hướng dẫn nằm ở here để đạt được những gì tôi đang tìm kiếm về tích hợp socket.io và phiên. Tuy nhiên, trong hàm ủy quyền, data.headers.cookie chưa bao giờ được đặt, mặc dù các phần dựa trên phiên làm việc của ứng dụng của tôi hoạt động như mong đợi. Điều lạ lùng hơn là sau khi cài đặt phiên, nếu tôi thực hiện một console.log(document.cookie) từ bên trong trình duyệt, tôi nhận được một chuỗi rỗng, nhưng khi tôi xem cookie của mình với thanh công cụ dành cho nhà phát triển Firefox, có một cookie SID cho cả express và connect.

Dưới đây là phần có liên quan của mã máy chủ:

var config = { 
    ip   : "127.0.0.1", 
    httpPort : 2031, 
    httpsPort : 2032 
}; 

var utils  = require("./utils"), 
    express  = require('express'), 
    fs   = require('fs'), 
    parseCookie = require('./node_modules/express/node_modules/connect').utils.parseCookie, 
    routes  = require('./routes')(config); 

var httpsOpts = { 
    key : fs.readFileSync("cert/server-key.pem").toString(), 
    cert: fs.readFileSync("cert/server-cert.pem").toString() 
}; 

var app    = express.createServer(), 
    https   = express.createServer(httpsOpts), 
    io    = require("socket.io").listen(app, { log: false}), 
    helpers   = require("./helpers.js"), 
    session   = new express.session.MemoryStore(), 
    sessionConfig = express.session({ 
     store : session, 
     secret : 'secret', 
     key  : 'express.sid', 
     cookie : {maxAge : 60 * 60 * 1000} 
    }); //share this across http and https 

configServer(app); 
configServer(https); 

//get SID for using sessions with sockets 
io.set('authorization', function(data, accept){ 
    if(data.headers.cookie){ 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['express.sid']; 
    } else { 
     return accept("No cookie transmitted", false); 
    } 

    accept(null, true); 
}); 

io.sockets.on('connection', function(socket){ 
    //pull out session information in here 
}); 

function configServer(server) { 
    server.configure(function(){ 
     server.dynamicHelpers(helpers.dynamicHelpers); 
     server.helpers(helpers.staticHelpers); 
     server.set('view options', { layout: false }); 
     server.set('view engine', 'mustache'); 
     server.set('views', __dirname + '/views'); 
     server.register(".mustache", require('stache')); 
     server.use(express.static(__dirname + '/public')); 
     server.use(express.bodyParser()); 
     server.use(express.cookieParser()); 
     server.use(sessionConfig); 
    }); 
} 

Và đây là mã có liên quan trên máy khách:

<script src="/socket.io/socket.io.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
     var socket = io.connect('http://127.0.0.1'); //make sure this isn't localhost! 
     socket.on('server', function(data){ 
      //socket logic is here 
     }); 
    } 
</script> 

CẬP NHẬT

Ngay cả sau khi thiết lập một cookie bằng tay (và không chỉ là biến phiên) trong tuyến đường cho trang đang sử dụng SocketIO, phần cookie của yêu cầu vẫn còn vắng mặt.

Trả lời

11

Tôi chưa bao giờ nghĩ đến điều này cho đến khi được yêu cầu xem xét việc khởi tạo ở phía máy khách. Tôi đã thay đổi địa chỉ từ localhost thành IP rõ ràng (127.0.0.1) và các cookie hiện đang được gửi với tiêu đề trong Socket.IO. Tôi không chắc chắn nếu điều này là hiển nhiên hay không, như tôi giả định localhost đã được ánh xạ tới 127.0.0.1 anyway.

+8

Chính xác! Đó là lý do tại sao tôi muốn mã khách hàng. Bạn cũng có thể sử dụng 'var socket = io.connect();' mà không cho phép lưu trữ. Nên làm việc. – freakish

+0

Chính xác cùng một vấn đề đối với tôi, và điều này làm việc hoàn hảo. – bento