当用户加入时,我发回一个带有昵称和 socketid 的对象。然后我就能显示所有用户并发送消息。
我想要做的是点击用户的名字,只向该用户发送消息。这是完整的回购chat app using socket.io
修改
我正在更新这个,只是请求一些关于如何抓取或正确过滤以从包含对象的数组中提取socketid的帮助。
我正在使用此功能根据点击事件过滤正确的用户:
$scope.sendLike = function(e) {
var toLike = $scope.users.filter(function(e) {
return e.nickname
});
var likeObj = {
from: $scope.mynickname,
like: toLike
}
socket.emit('send-like', likeObj);
}
我为我的用户找回了一个类似于:
的数组[ { nickname: 'me', socketid: '/#nadkl897dasd' } ]
我需要只返回 socketid
的值答案 0 :(得分:0)
我在下面开发了一个类似的应用程序,这些链接已经帮助了很多 -
http://www.tamas.io/advanced-chat-using-node-js-and-socket-io-episode-1/
以下是我使用的代码:
var express = require('express'),
http = require('http'),
app = express(),
server = http.createServer(app),
io = require('socket.io').listen(server),
users = {};
server.listen(3002);
console.log(__dirname)
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html')
});
io.sockets.on('connection', function (socket) {
socket.on('new user', function (data, callback) {
if (data in users)
callback(false);
//if (data === 'rahul') {
// socket.disconnect('unauthorized'); // for unauthorised users
// console.log('unauthorized');
//}
else {
callback(true);
socket.nickname = data;
users[socket.nickname] = socket;
updateNicknames()
}
});
socket.on('disconnect', function (data) {
if (!socket.nickname) return;
console.log('disconnect' + users[socket.nickname]);
delete users[socket.nickname];
updateNicknames()
});
function updateNicknames() {
io.sockets.emit('username',Object.keys(users))
}
socket.on('send message', function (data) {
//io.sockets.emit('new message', data); // used to send to everyone
var ind = data.indexOf(' ');
if(ind !== -1){
var name = data.substring(0, ind);
console.log(name);
var msg = data.substring(ind + 1);
console.log(msg);
if(name in users){
users[name].emit('whisper',{msg:msg, nick:socket.nickname});
}
}
});
});
如果您需要更多帮助,请告诉我。
答案 1 :(得分:0)
为了解决这个问题,我最终使用了lodash方法。用于操作数组/对象的优秀库。这是使用ng-lodash助手库。
$scope.sendLike = function(e) {
var toLike = $scope.users.filter(function(f) {
if(e.socketid === f.socketid)
return f.socketid;
});
// $scope.socketid = e.socketid;
var result = lodash.get(toLike, '[0].socketid');
var likeObj = {
from: $scope.mynickname,
like: result
}
socket.emit('send-like', likeObj);
}
我的HTML
<li class="user"
ng-repeat="user in users track by $index">
<a href="#" ng-click="sendLike(user)">