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.
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
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