我正在使用redis将会话cookie从PHP发送到Node / Express。我似乎能够访问我的server.js代码中的cookie的唯一方法是,如果我在客户端上创建一个空文件并将其包含在端口中这样:
<script type="text/javascript" src="http://dev.nodetest.com:8080/empty.js"></script>
如果我不在客户端上包含此内容,则无法访问节点服务器上的cookie数据。
我的要求是我不需要将cookie发送回客户端。只能在server.js中访问它以根据数据库对用户进行身份验证。
以下是我的server.js文件的内容:
var express = require('express'),
http = require('http'),
app = express(),
server = http.createServer(app),
io = require('socket.io').listen(8081),
cookieParser = require('cookie-parser'),
session = require('express-session'),
RedisStore = require('connect-redis')(session);
app.use(cookieParser());
app.use(session({
store: new RedisStore({
// this is the default prefix used by redis-session-php
prefix: 'session:php:'
}),
// use the default PHP session cookie name
name: 'PHPSESSID',
secret: 'node.js rules'
}));
app.use(function(req, res, next) {
console.log(req.session);
req.session.nodejs = 'Hello from node.js!';
res.send();
});
io.sockets.on('connection', function (socket) {
socket.on('subscribe', function(room) {
console.log('joining room', room);
socket.join(room);
});
});
app.listen(8080);
答案 0 :(得分:0)
您正在下面的快速中间件中打印会话信息:
app.use(function(req, res, next) {
console.log(req.session);
req.session.nodejs = 'Hello from node.js!';
res.send();
});
只有在您发出正常的http请求时才会调用此中间件(将其解释为快速请求)。当您使用 socket.io 进行交易时,上述代码永远不会被执行(例如,连接套接字,发送消息,断开连接等)。
index.php 会生成一个Cookie和一个页面,其中包含一个连接到 socket.io 的脚本并向其发送消息。当你这样做时,上述中间件不会被执行。但是,当你生成一个正常的请求&#34;上面的中间件将被执行。 这就是当您将脚本 empty.js 包括在内时执行中间件的原因:
<script type="text/javascript" src="http://dev.nodetest.com:8080/empty.js"></script>
在实践中,这将针对任何请求执行,例如。 http://dev.nodetest.com:8080/foobar 或 http://dev.nodetest.com:8080/anotherfoobar 。该URL不需要指向现有文件。端口8080上的任何URL都将调用中间件。但SOCKET.IO请求永远不会触及您的测试中间件。
修改强> 有些库可以帮助您在socket.io中使用会话。 sessio.socket.io似乎适合您的情况。