2017-05-04 92 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); 

現在它工作正常!