节点JS Express端口

时间:2014-05-28 12:37:17

标签: node.js express redis

我正在使用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);

1 个答案:

答案 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似乎适合您的情况。