[英]Node JS Express Ports
我正在使用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);
您正在下面的快速中间件中打印会话信息:
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并向其发出消息的脚本。 当您这样做时,不会执行上述中间件。 但是,当您生成“正常请求”时,将执行上述中间件。 这就是为什么在脚本中包含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似乎适合您的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.