Tri*_*der 5 sockets node.js express socket.io mean-stack
以下是前端的代码,其中storeSelUserId包含用于发送消息的user_id-
仅供参考 - 节点版本1.1.0
// Socket Notification
var socket = io('http://localhost:6868');
socket.on('connection', function (data) {
socket.emit('send notification', { sent_to: storeSelUserId });
});
Run Code Online (Sandbox Code Playgroud)
以下是路由文件中的服务器代码 -
var clients = {};
io.on('connection', function (socket) {
socket.emit('connection', "Connection Created.");
socket.on('send notification', function (sent_to) {
console.log(sent_to);
});
});
Run Code Online (Sandbox Code Playgroud)
在控制台sent_to中显示数组user_id.
socket.io我现在是一个先发制人,我坚持使用解决方案,如何将消息发送给这些特定的用户ID.
我搜索并发现我需要用其套接字推送每个用户,所以我将其改为 -
var users = [];
io.on('connection', function (socket) {
users.push({socket_id: socket.id});
socket.emit('connection', "Connection Created.");
socket.on('send notification', function (sent_to) {
console.log(sent_to);
});
});
Run Code Online (Sandbox Code Playgroud)
但是我处于两难境地,我还需要做什么来存储user_id哪个socket_id然后用特定的id更新用户的div?
编辑 -
添加控制器 - (前端)
前端接口,用于创建备忘录并发送给特定用户
var socket = io('http://localhost:6868');
socket.on('connection', function (data) {
socket.emit('send memo notification', {creator_id: creator_id, sent_to: [Array of user_ids to whom memo to send]});
});
Run Code Online (Sandbox Code Playgroud)
仪表板控制器 - (前端)
前端接口,其中通知计数显示"notificationCount"
if (SessionService.currentUser._id) {
var socket = io('http://localhost:6868');
socket.on('connection', function (data) {
socket.emit('get notifications', {user_id: SessionService.currentUser._id});
});
socket.on('notification data', function(data){
console.log("-- Not Data Test -");
$scope.notificationCount = data.length;
});
}
Run Code Online (Sandbox Code Playgroud)
服务器端的代码 -
io.on('connection', function (socket) {
socket.emit('connection', "Connection Created.");
socket.on('send memo notification', function(data) {
notifications.createNotification(data);
});
socket.on('get notifications', function(data){
notifications.getNotifications(data, function(response){
socket.emit('notification data', response.data);
});
});
});
Run Code Online (Sandbox Code Playgroud)
后端控制器代码 -
exports.getNotifications = function(data, callback) {
var userId = data.user_id;
Notification.find({receiver_id: userId}, function(err, response){
if (err)
callback({"message": "error", "data": err, "status_code": "500"});
else
callback({"message": "success", "data": response, "status_code": "200"});
});
};
exports.createNotification = function(data) {
var notificationData = data;
var x = 0;
for(var i=0; i< notificationData.length; i++) {
// Code
Notification(notificationData[i]).save(function(err,response){
if (err)
return false;
});
if (x === notificationData.length - 1) {
return true;
}
x++;
}
};
Run Code Online (Sandbox Code Playgroud)
Der*_*erM 18
如果您想使用自己的用户ID,则无法将套接字ID映射到用户ID.我假设一个客户端从某个地方知道它的用户ID,所以它可以在连接后将其用户ID发送到服务器.
客户
socket.on('connection', function (data) {
socket.emit('setUserId', myUserId);
});
Run Code Online (Sandbox Code Playgroud)
服务器为每个用户ID保存套接字.
socket.on('setUserId', function (userId) {
users[userId]=socket;
});
Run Code Online (Sandbox Code Playgroud)
如果您在服务器中有这样的映射,则可以使用用户ID向该客户端发送消息.
socket.on('send notification', function (userId) {
users[userId].emit('notification', "important notification message");
});
Run Code Online (Sandbox Code Playgroud)
编辑:直接保存相应的套接字甚至更好.