Socket.io + Angular - 发送私人消息

时间:2016-04-05 08:19:57

标签: angularjs node.js socket.io

当用户加入时,我发回一个带有昵称 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

的值

2 个答案:

答案 0 :(得分:0)

我在下面开发了一个类似的应用程序,这些链接已经帮助了很多 -

http://www.tamas.io/advanced-chat-using-node-js-and-socket-io-episode-1/

https://www.youtube.com/watch?v=k8o8-Q_-Qfk&ebc=ANyPxKo9fyO9bAywLGR9_p-_IcmkuQMK8Rfrk84qCON25JXlRReI8z3_5Qir9U1QNp6Sgm1RVkFfG-RHJ2y7ApVqd5gRVTarAQ#t=2.797

以下是我使用的代码:

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)">