【问题标题】:express nodejs socket.io LAMP表达 nodejs socket.io LAMP
【发布时间】:2017-06-28 22:41:09
【问题描述】:

我在 LAMP 环境中运行后端和前端,可通过 192.168.80.213/backend 192.168.80.213/frontend 访问。

我尝试使用 nodejs、socket.io 和 express 框架制作一个推送通知服务器来链接后端和前端。

示例:用户从前端订购东西,我从前端向我的 nodejs 服务器发出套接字,然后 nodejs 服务器向后端发出实时通知“嗨,你有新订单”

我的 nodejs 服务器正在侦听端口 3000,而我的后端和前端都在使用 apache 侦听端口 80。

这是我在后端的节点客户端:

<script type="text/javascript" src="script/javascript/socket.io-1.4.5.js"></script>
<script type="text/javascript">
    var socket = io('http://192.168.80.213:3000/');
</script>

很简单不是吗?

这是我的节点服务器:

const   express          = require('express')
        , app            = express()
        , http           = require('http').Server(app)
        , socketIo       = require('socket.io')(http)
        , cookieParser   = require('cookie-parser')
        , cookie         = require('cookie')
        , connect        = require('connect')
        , expressSession = require('express-session')
        , port           = 3000
        , helmet         = require('helmet')
        , name           = 'connect.sid'
        , sessionStore   = new expressSession.MemoryStore({ reapInterval: 60000 * 10 })
        , sessionSecret  = 'VH6cJa7yZSmkRbmjZW#J3%CDn%dt'
        , environment    = process.env.NODE_ENV || 'development'
        ;

/** Configuration **/
app.enable('trust proxy');
app.disable('x-powered-by');
app.use(helmet());
app.use(cookieParser());
app.use(expressSession({
    'name'  : name,
    'secret': sessionSecret,
    'store' : sessionStore,
    'resave': true,
    'saveUninitialized': true
}));

app.get('/', function(req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from node');
});

socketIo.use(function(socket, callback) {
    // Read cookies from handshake headers
    var cookies = cookie.parse(socket.handshake.headers.cookie);
    // We're now able to retrieve session ID
    var sessionID;
    if (cookies[name]) {
        console.log( "cookies['" + name + "'] = " + cookies[name] );
        sessionID = cookieParser.signedCookie( cookies[name], sessionSecret );
        console.log( "sessionID = " + sessionID );
    }else{
        console.log( "cookies['" + name + "'] = undefined" );
    }

    if (!sessionID) {
        console.log('ERROR NO SESSION CONNECTION REFUSED !!');
        callback('No session', false);
    } else {
        // Store session ID in handshake data, we'll use it later to associate
        // session with open sockets
        socket.handshake.sessionID = sessionID;
        callback(null, true);
    }

});


socketIo.on('connection', function (socket) { // New client
    console.log( 'new connection..' );
    console.log('user ' + socket.handshake.sessionID + ' authenticated and is now connected.');  

});

/** Start server */
http.listen(port);
console.log( "listening on :" + port );

转到192.168.80.213:3000,看到'Hello from node'和cookie['connect.sid']根据下面的截图设置

和控制台输出:

现在正在清除缓存,我要去我的后端应用程序,我的 nodeClient 192.168.80.213/backend 在哪里。

connect.sid cookie 不存在

和控制台输出:

为什么 express-session 不会设置 cookie.sid ?我该如何解决?我是node和express的新手,我用谷歌搜索了很多次都没有成功,希望一些节点大师能帮助我!!

问候

编辑 1

我在我的 apache conf 中添加了这个

ProxyPass /node http://localhost:3000/
ProxyPassReverse /node http://localhost:3000/
ProxyPreserveHost On

所以我可以使用 192.168.80.213/node 访问我的节点逻辑

但现在在我的客户端我得到了错误:

var socket = io('http://192.168.80.213/node');

192.168.80.213/socket.io/?EIO=3&amp;transport=polling&amp;t=LeehEkF 404 (Not Found)

【问题讨论】:

  • 我看到 io 路径选项可能是诀窍。我应该为路径设置什么值?!

标签: node.js express cookies socket.io lamp


【解决方案1】:

我认为是因为它在不同的端口上。你的 PHP 程序是做什么的?在 Node.js 中重现它可能非常容易。这样你就只需要一个程序和一个端口。

或者您可以使用 Apache 或 nginx 配置之类的东西,通过反向代理或其他东西使 URL 中的端口消失,以便浏览器保留 cookie。

【讨论】:

  • 我可以只用 node 做同样的程序,但我没有足够的时间来做这件事,它是一个 big PHP 程序。我用 apache 尝试了一些东西,但我的 nodeclient 不再工作并返回 404 错误:(也许你有一些配置可以提供给我@JasonLivesay?
【解决方案2】:

var socket = io('http://192.168.80.213/', { path: 'node'});

或者

var socket = io('http://192.168.80.213', { path: '/node'}); 试试这个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多