2017-02-10 140 views
0

我有背部和前端运行在LAMP环境可访问192.168.80.213/backend192.168.80.213/frontendexpress nodejs socket.io LAMP

我尝试使用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> 

很简单isnt'it?

这里是我的节点服务器:

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和看从节点你好'和饼干[ 'connect.sid']根据下面

connect.sid cookie correctly set

截图设置

和控制台输出:

enter image description here

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

connect.sid cookie不存在

enter image description here

和控制台输出:

enter image description here

为什么快递-session不会设置cookie.sid?我该如何解决这个问题?我是新来的节点和表达,我花了很多次搜索没有成功,希望一些节点大师coul帮助我!

问候

编辑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&transport=polling&t=LeehEkF 404 (Not Found)

+0

我看到io路径选项可能是诀窍。我应该为道路设定什么样的价值?! – akio

回答

0

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

或者你也许能够使用类似Apache或nginx配置的东西,使端口在带有反向代理或其他东西的URL中消失,以便浏览器保留cookie。

+0

我只能用节点完成同一个程序,但是我没有足够的时间来完成这个任务,而且它是一个**大** PHP程序。我尝试了一些与Apache的东西,但我的nodeclient不工作了,并返回一个404错误:(也许你有一些配置为我提供@JasonLivesay? – akio