我正在尝试使用express / nodejs创建一个基本的消息传递系统。虽然我能够成功地向所有用户发送消息。我需要用户能够以一对一的私密方式互相发送消息。
我在下面尝试做的很简单。当用户登录时,一旦验证了会话,就将用户对象存储在clients
数组中,并在视图中访问该数组 - 这就是它!
目的是当用户登录时,此阵列将在服务器上增长,并且我需要在视图中使其可访问,因此我可以生成可用于聊天的在线用户列表。
我尝试了几种不同的方法,下面的方法会在视图中产生一个空数组。
我的目标是在登录时将在线用户存储在服务器上的数组中,并在视图中访问该数组。
我感谢任何建议。
index.js
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var mysql = require('mysql');
var session = require('client-sessions');
var server = require('http').createServer( app );
var io = require('socket.io').listen( server );
var clients = [];
app.locals.delimiters = '<% %>';
app.get('/', function(req, res){
if(req.session && req.session.user.username){
mysql.query("SELECT * FROM users WHERE username = ? AND pass = ? LIMIT 1", [req.session.user.username, req.session.user.pass], function(error, results, fields){
if(results.length === 0){
req.session.reset();
res.redirect('/login');
}else{
res.locals.user = results[0];
io.sockets.on('connection', function(socket){
clients.push({user : res.locals.user, socket : socket});
});
res.render('index');
}
});
}else{
res.redirect('/login');
}
});
server.listen( 3331 ); //chat port
io.sockets.on('connection', function(socket){
//load all users
socket.on('load users', function(){
io.emit('load users', {clients : clients});
});
socket.on('error', function(err){
console.error(err.stack);
});
});
module.exports = app;
index.hjs
<div class="messenger-user" ng-repeat="n in clients">
<div class="avatar-icon glyphicon glyphicon-user">
</div>
<div class="user-meta">
{{n.user.firstname}} {{n.user.lastname}}
</div>
</div>
index.hjs JavaScript
socket.emit('load users', function(clients){
$scope.clients = clients;
$scope.$apply();
});
答案 0 :(得分:0)
具有完美的感觉。它发送一个空数组,因为你在填充它之前发送它。
目前: 1)启动MySQL查询以检索和填充用户数组。
2)同时,触发了一个套接字on 'connection'
事件(第24行),它发出当前为空的users数组。
3)您的MySQL查询结束(第3行)并返回您想要的数据。
4)在回调函数中,为io.sockets.on('connection')
设置另一个监听器。现在为时已晚,因为您已经设置了一个,并且连接事件已经发生。所以你有两个同一个事件的听众,第二个听不到。
你应该做的是等待SQL查询结束,然后填充你的数组并将其发送给客户端。
编辑2:不要同时使用HTTP连接和套接字进行身份验证。您正在尝试从HTTP请求中存储用户对象,以及与HTTP请求无关的套接字。用套接字做一切:
var clients = [];
io.sockets.on('connection', function(socket){
socket.on('credentials', function(data){ // data == { "username":"John" , "password":"123456" }
login(data, socket); // sending credentials and socket to the login function, so both are defined there.
})
socket.on('error', function(err){
console.error(err.stack);
});
});
function login(data, socket){
mysql.query("SELECT * FROM users WHERE username='"+data.username+"' AND pass='"+data.password+"' LIMIT 1", [req.session.user.username, req.session.user.pass], function(error, results, fields){
if(!results.length){
req.session.reset();
res.redirect('/login');
}else{
clients.push({user : results[0], socket : socket}); // Both defined!
io.emit('load users', {clients : clients});
res.render('index');
}
});
}
server.listen( 3331 ); //chat port