2017-05-04 88 views
0

我与私人消息聊天,但私人消息无效。 这是app.jsnode.js socket.io监听器无法正常工作

var express = require('express'),http = require('http'); 
 
var app = express(); 
 
var server = http.createServer(app); 
 
console.log("Hola"); 
 
app.set('views',__dirname + '/views'); 
 

 
\t app.use(express.static(__dirname)); 
 

 
app.get('/',function(req,res){ 
 
\t res.render('index.jade',{layout:false}); 
 
}); 
 
app.post('/', function(req, res) { 
 
    if (req.session.logged) 
 
    { 
 
    \t res.send('Welcome back!'); 
 
    \t console.log("Welcome back!"); 
 
    } 
 
    else 
 
    { 
 
     req.session.logged = true; 
 
     res.send('Welcome!'); 
 
     console.log("Welcome"); 
 
    } 
 
}); 
 
server.listen(1080); 
 

 
function tstamp() { 
 
    var currentTime = new Date(); 
 
    var days = new Array('Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab'); 
 
    var day = currentTime.getDay(); 
 
    var hours = currentTime.getHours(); 
 
    var minutes = currentTime.getMinutes(); 
 
    if (minutes < 10) { 
 
    minutes = "0" + minutes; 
 
    } 
 
    if (hours > 11) { 
 
    var ap = 'p'; 
 
    } 
 
    else { 
 
    var ap = 'a'; 
 
    } 
 
    if (hours > 12) { 
 
    hours = hours - 12; 
 
    } 
 

 
    return "["+ days[day] + " " + hours + ":" + minutes + ap + "m] "; 
 
} 
 

 
//websockets 
 
var io = require('socket.io').listen(server); 
 
var usuariosConectados = {}; 
 
var usuariosId ={}; 
 
io.sockets.on('connection',function(socket){ 
 
\t socket.on('enviarNombre',function(dato){ 
 
\t \t if(usuariosConectados[dato]) 
 
\t \t \t socket.emit('errorName'); 
 
\t \t else 
 
\t \t \t { 
 
\t \t \t \t // store the nickname in the socket session for this client 
 
\t \t \t \t socket.nickname = dato; 
 
\t \t \t \t //console.log("El usuario es: " + dato); 
 
\t \t \t \t usuariosConectados[dato] = socket.nickname; 
 
\t \t \t \t usuariosId[dato] = socket.id; 
 
\t \t \t } 
 
\t \t \t sId = [dato,usuariosId]; 
 
\t \t \t data = [dato,usuariosConectados]; 
 
\t \t \t io.sockets.emit('mensaje',data); 
 
\t }); 
 
\t socket.on('enviarMensaje',function(mensaje){ 
 
\t \t var data = [socket.nickname, mensaje]; 
 
\t \t io.sockets.emit('newMessage',data); 
 
\t }); 
 
\t socket.on('mensajePrivado',function(targetUser,msg) { 
 
\t \t //console.log(sId[1][targetUser]); 
 
\t \t //console.log(msg); 
 
\t \t //console.log(socket.id); 
 
\t \t console.log(tstamp()); 
 
     io.sockets.socket(sId[1][targetUser]).emit('newPrivado', tstamp(), socket.nickname, targetUser, msg); 
 
     io.sockets.socket(socket.id).emit('newPrivadoSender', tstamp(), socket.nickname, targetUser, msg); 
 
    }); 
 
\t socket.on('disconnect',function(){ 
 
\t \t console.log("Entro a disconnect"); 
 
\t \t delete usuariosConectados[socket.nickname]; 
 
\t \t data = [usuariosConectados,socket.nickname]; 
 
\t \t io.sockets.emit('usuarioDesconectado',data); 
 
\t }); 
 
});

问题是,当我使用监听器“mensajePrivado”它从来没有到那里,我不知道为什么。 socket.on('enviarMensaje')监听器工作正常。

我这样称呼它:

function sendPrivateMessage (targetUser) 
 
{ 
 
\t console.log("entro en sendPrivateMessage"); 
 
\t var privateMsg = $('#'+ targetUser + 'privateMsg').val(); 
 
\t //verificamos que no tenga scripts 
 
\t if((privateMsg.indexOf("<") != -1)) 
 
\t { 
 
\t \t alert("Mensaje incorrecto"); 
 
\t } 
 
\t else if((privateMsg.indexOf(">") != -1)) 
 
\t { 
 
\t \t alert("Mensaje incorrecto"); 
 
\t } 
 
\t else if((privateMsg.indexOf(";") != -1)) 
 
\t { 
 
\t \t alert("Mensaje incorrecto"); 
 
\t } 
 
\t else 
 
\t { 
 
\t \t $('#'+ targetUser + 'privateMsg').val(""); 
 
\t \t console.log(privateMsg); 
 
\t \t console.log(targetUser); 
 
\t \t websocket.emit('mensajePrivado', targetUser, privateMsg); 
 
\t } 
 
}

而且当我检查在Chrome浏览器中我得到以下错误
失败的元素:WebSocket的握手过程中的错误:“连接”头值必须包含'升级'

我该如何解决所有这些问题?

在此先感谢!

+0

您是否在节点前使用代理?错误“Connection”标题值必须包含“Upgrade”表示你有Apache/Nginx/etc。在Node前面,它没有为websocket设置适当的头文件 –

+0

我在Plesk Onyx中有Nginx。我如何配置? – user995691

+0

阅读本文的“虚拟主机配置”部分:https://www.nginx.com/blog/nginx-nodejs-websockets-socketio/ –

回答

0

好了,问题是在这个部分:

io.sockets.socket(sId[1][targetUser]).emit('newPrivado', tstamp(), socket.nickname, targetUser, msg); 
    io.sockets.socket(socket.id).emit('newPrivadoSender', tstamp(), socket.nickname, targetUser, msg); 

我这种替换:

io.to(sId[1][targetUser]).emit('newPrivado', tstamp(), socket.nickname, targetUser, msg); 
    io.to(socket.id).emit('newPrivadoSender', tstamp(), socket.nickname, targetUser, msg); 

现在它工作正常!